├── .env.example ├── .eslintrc.json ├── .github └── workflows │ ├── build.yaml │ ├── deploy_worker.yaml │ ├── lint.yaml │ └── test.yaml ├── .gitignore ├── LICENSE ├── README.md ├── lerna.json ├── package-lock.json ├── package.json ├── packages ├── agent │ ├── .dev.vars.example │ ├── jest.config.js │ ├── package.json │ ├── scripts │ │ └── concat.mjs │ ├── src │ │ ├── actions │ │ │ ├── __tests__ │ │ │ │ └── introduce.test.ts │ │ │ ├── index.ts │ │ │ └── introduce.ts │ │ ├── evaluators │ │ │ ├── __tests__ │ │ │ │ ├── details.test.ts │ │ │ │ └── profile.test.ts │ │ │ ├── details.ts │ │ │ ├── index.ts │ │ │ └── profile.ts │ │ ├── index.ts │ │ └── providers │ │ │ ├── directions.ts │ │ │ └── time.ts │ ├── test │ │ ├── cache.ts │ │ ├── constants.ts │ │ └── data.ts │ ├── tsconfig.json │ └── wrangler.toml ├── app-native │ ├── .eslintignore │ ├── .eslintrc.json │ ├── .gitignore │ ├── .npmrc │ ├── README.md │ ├── build │ │ ├── entitlements.mac.plist │ │ ├── icon.icns │ │ ├── icon.ico │ │ └── icon.png │ ├── dev-app-update.yml │ ├── electron-builder.yml │ ├── electron.vite.config.ts │ ├── package.json │ ├── resources │ │ └── icon.png │ ├── src │ │ ├── main │ │ │ └── index.ts │ │ ├── preload │ │ │ └── index.ts │ │ └── renderer │ │ │ ├── index.html │ │ │ ├── src │ │ │ ├── env.d.ts │ │ │ ├── index.css │ │ │ ├── main.tsx │ │ │ └── vite-env.d.ts │ │ │ └── vite-env.d.ts │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── tsconfig.web.json ├── app │ ├── .eslintrc │ ├── .gitignore │ ├── android │ │ ├── .gitignore │ │ ├── app │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── capacitor.build.gradle │ │ │ ├── proguard-rules.pro │ │ │ └── src │ │ │ │ ├── androidTest │ │ │ │ └── java │ │ │ │ │ └── com │ │ │ │ │ └── getcapacitor │ │ │ │ │ └── myapp │ │ │ │ │ └── ExampleInstrumentedTest.java │ │ │ │ ├── main │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── java │ │ │ │ │ └── app │ │ │ │ │ │ └── cojourney │ │ │ │ │ │ └── app │ │ │ │ │ │ └── MainActivity.java │ │ │ │ └── res │ │ │ │ │ ├── drawable-land-hdpi │ │ │ │ │ └── splash.png │ │ │ │ │ ├── drawable-land-mdpi │ │ │ │ │ └── splash.png │ │ │ │ │ ├── drawable-land-xhdpi │ │ │ │ │ └── splash.png │ │ │ │ │ ├── drawable-land-xxhdpi │ │ │ │ │ └── splash.png │ │ │ │ │ ├── drawable-land-xxxhdpi │ │ │ │ │ └── splash.png │ │ │ │ │ ├── drawable-port-hdpi │ │ │ │ │ └── splash.png │ │ │ │ │ ├── drawable-port-mdpi │ │ │ │ │ └── splash.png │ │ │ │ │ ├── drawable-port-xhdpi │ │ │ │ │ └── splash.png │ │ │ │ │ ├── drawable-port-xxhdpi │ │ │ │ │ └── splash.png │ │ │ │ │ ├── drawable-port-xxxhdpi │ │ │ │ │ └── splash.png │ │ │ │ │ ├── drawable-v24 │ │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ │ ├── drawable │ │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ │ └── splash.png │ │ │ │ │ ├── layout │ │ │ │ │ └── activity_main.xml │ │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ │ ├── ic_launcher.xml │ │ │ │ │ └── ic_launcher_round.xml │ │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ ├── values │ │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ │ ├── strings.xml │ │ │ │ │ └── styles.xml │ │ │ │ │ └── xml │ │ │ │ │ └── file_paths.xml │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── getcapacitor │ │ │ │ └── myapp │ │ │ │ └── ExampleUnitTest.java │ │ ├── build.gradle │ │ ├── capacitor.settings.gradle │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── settings.gradle │ │ └── variables.gradle │ ├── capacitor.config.ts │ ├── index.html │ ├── ios │ │ ├── .gitignore │ │ └── App │ │ │ ├── App.xcodeproj │ │ │ ├── project.pbxproj │ │ │ └── project.xcworkspace │ │ │ │ └── contents.xcworkspacedata │ │ │ ├── App.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ ├── App │ │ │ ├── AppDelegate.swift │ │ │ ├── Assets.xcassets │ │ │ │ ├── AppIcon.appiconset │ │ │ │ │ ├── AppIcon-512@2x.png │ │ │ │ │ └── Contents.json │ │ │ │ ├── Contents.json │ │ │ │ └── Splash.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── splash-2732x2732-1.png │ │ │ │ │ ├── splash-2732x2732-2.png │ │ │ │ │ └── splash-2732x2732.png │ │ │ ├── Base.lproj │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ └── Main.storyboard │ │ │ └── Info.plist │ │ │ ├── Podfile │ │ │ └── Podfile.lock │ ├── package.json │ ├── public │ │ ├── cj.jpg │ │ ├── favicon.svg │ │ ├── icons │ │ │ ├── account.svg │ │ │ ├── arrow_down.svg │ │ │ ├── arrow_left.svg │ │ │ ├── arrow_right.svg │ │ │ ├── burger.svg │ │ │ ├── chat.svg │ │ │ ├── cj.svg │ │ │ ├── close.svg │ │ │ ├── discord.svg │ │ │ ├── ellipses.svg │ │ │ ├── github.svg │ │ │ ├── google.svg │ │ │ ├── logo.svg │ │ │ ├── menu.svg │ │ │ ├── send.svg │ │ │ └── x.svg │ │ ├── images │ │ │ ├── NewBackground.jpg │ │ │ ├── background-chat.svg │ │ │ ├── background-friends.svg │ │ │ ├── background-potrait-alpha-10.svg │ │ │ ├── background-potrait-alpha-50.svg │ │ │ ├── background.png │ │ │ ├── discord.svg │ │ │ ├── github.svg │ │ │ ├── google.svg │ │ │ ├── user-avatar-bot.svg │ │ │ ├── user-avatar-robot.svg │ │ │ ├── user.svg │ │ │ └── x.svg │ │ └── profile-images │ │ │ ├── 1.jpg │ │ │ ├── 10.jpg │ │ │ ├── 100.jpg │ │ │ ├── 101.jpg │ │ │ ├── 102.jpg │ │ │ ├── 103.jpg │ │ │ ├── 104.jpg │ │ │ ├── 105.jpg │ │ │ ├── 106.jpg │ │ │ ├── 11.jpg │ │ │ ├── 12.jpg │ │ │ ├── 13.jpg │ │ │ ├── 14.jpg │ │ │ ├── 15.jpg │ │ │ ├── 16.jpg │ │ │ ├── 17.jpg │ │ │ ├── 18.jpg │ │ │ ├── 2.jpg │ │ │ ├── 20.jpg │ │ │ ├── 21.jpg │ │ │ ├── 22.jpg │ │ │ ├── 23.jpg │ │ │ ├── 24.jpg │ │ │ ├── 25.jpg │ │ │ ├── 26.jpg │ │ │ ├── 27.jpg │ │ │ ├── 28.jpg │ │ │ ├── 29.jpg │ │ │ ├── 3.jpg │ │ │ ├── 30.jpg │ │ │ ├── 31.jpg │ │ │ ├── 32.jpg │ │ │ ├── 33.jpg │ │ │ ├── 34.jpg │ │ │ ├── 35.jpg │ │ │ ├── 36.jpg │ │ │ ├── 37.jpg │ │ │ ├── 38.jpg │ │ │ ├── 39.jpg │ │ │ ├── 4.jpg │ │ │ ├── 40.jpg │ │ │ ├── 41.jpg │ │ │ ├── 42.jpg │ │ │ ├── 43.jpg │ │ │ ├── 44.jpg │ │ │ ├── 45.jpg │ │ │ ├── 46.jpg │ │ │ ├── 47.jpg │ │ │ ├── 48.jpg │ │ │ ├── 49.jpg │ │ │ ├── 5.jpg │ │ │ ├── 50.jpg │ │ │ ├── 51.jpg │ │ │ ├── 52.jpg │ │ │ ├── 53.jpg │ │ │ ├── 54.jpg │ │ │ ├── 55.jpg │ │ │ ├── 56.jpg │ │ │ ├── 57.jpg │ │ │ ├── 58.jpg │ │ │ ├── 59.jpg │ │ │ ├── 6.jpg │ │ │ ├── 60.jpg │ │ │ ├── 61.jpg │ │ │ ├── 62.jpg │ │ │ ├── 63.jpg │ │ │ ├── 64.jpg │ │ │ ├── 65.jpg │ │ │ ├── 66.jpg │ │ │ ├── 67.jpg │ │ │ ├── 68.jpg │ │ │ ├── 69.jpg │ │ │ ├── 7.jpg │ │ │ ├── 70.jpg │ │ │ ├── 71.jpg │ │ │ ├── 72.jpg │ │ │ ├── 73.jpg │ │ │ ├── 74.jpg │ │ │ ├── 75.jpg │ │ │ ├── 76.jpg │ │ │ ├── 77.jpg │ │ │ ├── 78.jpg │ │ │ ├── 79.jpg │ │ │ ├── 8.jpg │ │ │ ├── 80.jpg │ │ │ ├── 81.jpg │ │ │ ├── 82.jpg │ │ │ ├── 83.jpg │ │ │ ├── 84.jpg │ │ │ ├── 85.jpg │ │ │ ├── 86.jpg │ │ │ ├── 87.jpg │ │ │ ├── 88.jpg │ │ │ ├── 89.jpg │ │ │ ├── 9.jpg │ │ │ ├── 90.jpg │ │ │ ├── 91.jpg │ │ │ ├── 92.jpg │ │ │ ├── 93.jpg │ │ │ ├── 94.jpg │ │ │ ├── 95.jpg │ │ │ ├── 96.jpg │ │ │ ├── 97.jpg │ │ │ ├── 98.jpg │ │ │ └── 99.jpg │ ├── src │ │ ├── App.css │ │ ├── App.tsx │ │ ├── Hooks │ │ │ ├── relationships │ │ │ │ ├── useHandleFriendRequests.tsx │ │ │ │ └── useListenToFrienshipChanges.tsx │ │ │ ├── rooms │ │ │ │ ├── useGetRoomMessages.tsx │ │ │ │ ├── useListenToMessagesChanges.tsx │ │ │ │ ├── useListenToRoomChanges.tsx │ │ │ │ ├── useListenToUnreadMessages.tsx │ │ │ │ ├── useLoadUnreadMessages.tsx │ │ │ │ ├── useRoomData.tsx │ │ │ │ ├── useTypingBroadcast.tsx │ │ │ │ └── useTypingStatus.tsx │ │ │ ├── useHandleSignout.tsx │ │ │ └── useLoadUserData.tsx │ │ ├── components │ │ │ ├── AccountInfo │ │ │ │ └── index.tsx │ │ │ ├── AuthUser │ │ │ │ └── AuthUser.tsx │ │ │ ├── Friends │ │ │ │ ├── FriendsConditionalRendering │ │ │ │ │ └── FriendsConditionalrendering.tsx │ │ │ │ ├── FriendsList │ │ │ │ │ └── FriendsList.tsx │ │ │ │ ├── FriendsPendingList │ │ │ │ │ └── FriendsPendingList.tsx │ │ │ │ ├── FriendsRequestsList │ │ │ │ │ └── FriendsRequestsList.tsx │ │ │ │ └── GuidesList │ │ │ │ │ └── GuidesList.tsx │ │ │ ├── Header │ │ │ │ └── index.tsx │ │ │ ├── InfoScreens │ │ │ │ └── EmptyRoom.tsx │ │ │ ├── LoadingOverlay │ │ │ │ ├── LoadingOverlay.tsx │ │ │ │ └── useLoadingOverlayStyles.ts │ │ │ ├── MobileHeader │ │ │ │ └── MobileHeader.tsx │ │ │ ├── OAuthUser │ │ │ │ ├── index.module.css │ │ │ │ └── index.tsx │ │ │ ├── ProfileHeader │ │ │ │ ├── index.tsx │ │ │ │ └── useProfileHeaderStyles.ts │ │ │ ├── RegisterUser │ │ │ │ ├── RegisterUser.styles.ts │ │ │ │ ├── RegisterUser.tsx │ │ │ │ ├── helpers │ │ │ │ │ └── UploadProfileImage.tsx │ │ │ │ │ │ └── UploadProfileImage.tsx │ │ │ │ └── steps │ │ │ │ │ ├── step1.tsx │ │ │ │ │ └── step2.tsx │ │ │ ├── SideMenu │ │ │ │ ├── ChangeThemeModal │ │ │ │ │ └── ChangeThemeModal.tsx │ │ │ │ ├── DMs │ │ │ │ │ └── DMs.tsx │ │ │ │ ├── MobileSideMenu │ │ │ │ │ ├── MobileSideMenu.tsx │ │ │ │ │ └── MobileSideMenustyles.ts │ │ │ │ ├── SideMenu.styles.ts │ │ │ │ ├── SideMenu.tsx │ │ │ │ └── SideMenuScreens │ │ │ │ │ ├── FriendsSideMenuScreen.tsx │ │ │ │ │ ├── MessagesSideMenuScreen.tsx │ │ │ │ │ └── SettingsSideMenuScreen.tsx │ │ │ ├── UserAvatar │ │ │ │ └── index.tsx │ │ │ ├── UserAvatarWithIndicator │ │ │ │ └── UserAvatarWithIndicator.tsx │ │ │ └── UserPopup │ │ │ │ └── UserPopup.tsx │ │ ├── constants │ │ │ └── constants.ts │ │ ├── helpers │ │ │ ├── functions.ts │ │ │ ├── getAvatarImage.ts │ │ │ ├── getUnreadMessagesInDms.ts │ │ │ ├── getUnreadMessagesInRooms.ts │ │ │ └── removeTypingIndicatorFromOfflineUsers.ts │ │ ├── index.css │ │ ├── main.tsx │ │ ├── pages │ │ │ ├── 404 │ │ │ │ ├── Error404.tsx │ │ │ │ └── useError404Styles.ts │ │ │ └── app │ │ │ │ ├── FriendProfile │ │ │ │ └── index.tsx │ │ │ │ ├── MainLayout.tsx │ │ │ │ ├── LayoutStyles.ts │ │ │ │ └── index.tsx │ │ │ │ ├── Room │ │ │ │ ├── LoadingRoomData │ │ │ │ │ └── LoadingRoomData.tsx │ │ │ │ ├── Messages │ │ │ │ │ ├── Message │ │ │ │ │ │ └── Message.tsx │ │ │ │ │ ├── Messages.tsx │ │ │ │ │ ├── MessagesFunctions │ │ │ │ │ │ └── MessageFunctions.tsx │ │ │ │ │ └── useMessageStyles.ts │ │ │ │ ├── MessagesTextInput │ │ │ │ │ └── MessagesTextInput.tsx │ │ │ │ ├── Room.tsx │ │ │ │ ├── RoomHeader │ │ │ │ │ ├── RoomHeader.tsx │ │ │ │ │ └── useRoomHeaderStyles.ts │ │ │ │ ├── RoomNotFound │ │ │ │ │ └── RoomNotFound.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── useRoomStyles.ts │ │ │ │ ├── TOS │ │ │ │ └── index.tsx │ │ │ │ ├── UserPreferences │ │ │ │ ├── EditUser │ │ │ │ │ └── EditUser.tsx │ │ │ │ └── UserPreferences.tsx │ │ │ │ ├── UserProfile │ │ │ │ ├── index.styles.ts │ │ │ │ └── index.tsx │ │ │ │ ├── root.tsx │ │ │ │ └── useRootStyles.ts │ │ ├── store │ │ │ └── useGlobalStore.ts │ │ └── utils │ │ │ └── getFriend.ts │ ├── tailwind.config.js │ ├── tsconfig.json │ ├── tsconfig.node.json │ ├── types │ │ └── database.types.ts │ ├── vercel.json │ ├── vite-env.d.ts │ └── vite.config.ts └── docs │ ├── .gitignore │ ├── .prettierrc.json │ ├── README.md │ ├── babel.config.js │ ├── docs │ └── intro.md │ ├── docusaurus.config.js │ ├── package.json │ ├── sidebars.js │ ├── src │ ├── components │ │ └── HomepageFeatures │ │ │ ├── index.js │ │ │ └── styles.module.css │ ├── css │ │ └── custom.css │ └── pages │ │ ├── index.js │ │ ├── index.module.css │ │ └── markdown-page.md │ └── static │ ├── .nojekyll │ └── img │ ├── background.jpg │ ├── banner.jpg │ ├── cj.jpg │ ├── cj2.jpg │ ├── cj3.jpg │ ├── favicon.svg │ └── logo.svg ├── scripts ├── cj.mjs ├── lore.mjs ├── requests.md └── shell.mjs ├── tsconfig.json └── vercel.json /.env.example: -------------------------------------------------------------------------------- 1 | VITE_SERVER_URL=http://localhost:7998 2 | SUPABASE_URL=https://xxxxx.supabase.co 3 | SUPABASE_SERVICE_API_KEY=xxxxx.xxxxx.xxxxx 4 | VITE_SUPABASE_URL=https://xxxxx.supabase.co 5 | VITE_SUPABASE_ANON_KEY=xxxxx.xxxxx.xxxxx 6 | OPENAI_API_KEY=sk-xxxxx 7 | SERVER_URL=https://api.openai.com/v1 8 | NODE_ENV=development -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2021": true, 5 | "node": true 6 | }, 7 | "extends": [ 8 | "standard-with-typescript", 9 | "plugin:react/recommended" 10 | ], 11 | "parserOptions": { 12 | "ecmaVersion": "latest", 13 | "sourceType": "module", 14 | "project": "./tsconfig.json" 15 | }, 16 | "plugins": [ 17 | "react" 18 | ], 19 | "rules": { 20 | // ignore no-tabs 21 | "no-tabs": "off", 22 | "@typescript-eslint/strict-boolean-expressions": "off", 23 | "@typescript-eslint/no-non-null-assertion": "off", 24 | "@typescript-eslint/explicit-function-return-type": "off", 25 | "@typescript-eslint/consistent-type-assertions": "off", 26 | "@typescript-eslint/naming-convention": "off", 27 | "@typescript-eslint/no-misused-promises": "off", 28 | "@typescript-eslint/no-floating-promises": "off", 29 | "@typescript-eslint/prefer-nullish-coalescing": "off", 30 | "@typescript-eslint/no-throw-literal": "off", 31 | "@typescript-eslint/ban-ts-comment": "off", 32 | "no-empty-pattern": "off", 33 | "react/prop-types": "off", 34 | "@typescript-eslint/indent": "off", 35 | "no-case-declarations": "off", 36 | "react/react-in-jsx-scope": "off", 37 | "@typescript-eslint/triple-slash-reference": "off", 38 | "multiline-ternary": "off", 39 | "@typescript-eslint/brace-style": "off", 40 | "@typescript-eslint/no-unnecessary-type-assertion": "off" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /.github/workflows/build.yaml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v2 15 | - uses: actions/setup-node@v2 16 | 17 | - run: npm ci 18 | - run: npm run build -------------------------------------------------------------------------------- /.github/workflows/deploy_worker.yaml: -------------------------------------------------------------------------------- 1 | name: Deploy Cloudflare Worker 2 | on: 3 | push: 4 | branches: 5 | - main 6 | 7 | jobs: 8 | deploy: 9 | runs-on: ubuntu-latest 10 | name: Deploy 11 | steps: 12 | - uses: actions/checkout@v3 13 | 14 | - name: Setup Node.js 15 | uses: actions/setup-node@v4 16 | with: 17 | node-version: '20' 18 | cache: 'npm' 19 | 20 | - name: Install Dependencies 21 | run: npm install 22 | 23 | - name: Deploy Worker 24 | env: 25 | CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} 26 | CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} 27 | run: cd packages/agent && npx wrangler deploy -------------------------------------------------------------------------------- /.github/workflows/lint.yaml: -------------------------------------------------------------------------------- 1 | name: Lint 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v2 15 | - uses: actions/setup-node@v2 16 | 17 | - run: npm ci 18 | - run: npm run lint -------------------------------------------------------------------------------- /.github/workflows/test.yaml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | env: 10 | OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} 11 | SUPABASE_URL: ${{ secrets.SUPABASE_URL }} 12 | SUPABASE_SERVICE_API_KEY: ${{ secrets.SUPABASE_SERVICE_API_KEY }} 13 | 14 | jobs: 15 | build: 16 | runs-on: ubuntu-latest 17 | 18 | steps: 19 | - uses: actions/checkout@v2 20 | - uses: actions/setup-node@v2 21 | 22 | - run: npm ci 23 | - run: npm run test -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/.cache 2 | **/coverage 3 | **/dist 4 | **/node_modules 5 | **/.dev.vars 6 | .wrangler 7 | .env 8 | .env 9 | embedding-cache.json 10 | test-report.json -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2024 Moon 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cojourney 2 | 3 | Cojourney 4 | 5 | Cojourney is about making high quality connections with other people. It's a social network that's designed to help you find people who share your interests, and to help you build the right context. 6 | 7 | ## Developing Live on Discord 8 | 9 | 10 | # Strong connections start with friendship 11 | The current state of personal connection apps is not great. Making friends is strange and awkward, and it's hard to know who to trust. Dating apps are even worse, and they're not designed to help you make meaningful connections. 12 | 13 | CJ is an AI who can bridge the gap. Once she knows a bit about you she can connect you with other people in a meaningful way, providing context and commonality to help you get started. If you're not totally sure what you're looking for, she'll help you identify it, or help with what to say or how to react. 14 | 15 | If you want to try talking to CJ, you can get started right away by running: 16 | ```sh 17 | npx cojourney 18 | ``` 19 | 20 | ## Installation 21 | 22 | ```bash 23 | npm install 24 | npm build # build the packages at least once 25 | ``` 26 | 27 | ## Usage 28 | 29 | To start everything 30 | ```bash 31 | npm run dev 32 | # App: http://localhost:3000 33 | # Site: http://localhost:3001 34 | # Docs: http://localhost:3002 35 | # API: http://localhost:7998 36 | ``` 37 | 38 | Once you've started everything, you can talk to CJ, the default agent, by opening a new terminal and running the shell: 39 | ```bash 40 | npm run cj 41 | ``` 42 | 43 | ## Contributing 44 | 45 | This project is in early pre-alpha and developed in the open. If you want to make it better, you can contribute. We're looking to connect with people who are passionate about using AI to help people have stronger human relationships. We build on Discord, here: https://discord.gg/N3XUfWSTTe 46 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "node_modules/lerna/schemas/lerna-schema.json", 3 | "version": "0.0.0" 4 | } 5 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cojourney", 3 | "description": "Real human connection. Powered by AI.", 4 | "version": "0.0.9", 5 | "author": "Cojourney (https://cojourney.app)", 6 | "repository": "https://github.com/ClioDynamics/Cojourney", 7 | "bugs": "https://github.com/ClioDynamics/Cojourney/issues", 8 | "license": "MIT", 9 | "workspaces": [ 10 | "packages/*" 11 | ], 12 | "resolutions": { 13 | "@types/react": "^18.2.63", 14 | "react": "^18.2.0", 15 | "react-dom": "^18.2.0" 16 | }, 17 | "scripts": { 18 | "dev": "lerna run dev --ignore @cojourney/app-native --ignore @cojourney/docs", 19 | "dev:all": "lerna run dev", 20 | "shell": "node --no-warnings scripts/shell.mjs", 21 | "shell:dev": "node --no-warnings scripts/shell.mjs --dev", 22 | "build": "lerna run build", 23 | "test": "lerna run test", 24 | "coverage": "lerna run coverage", 25 | "types": "lerna run types", 26 | "lint": "lerna run lint", 27 | "format": "lerna run format" 28 | }, 29 | "bin": { 30 | "cj": "./scripts/shell.mjs" 31 | }, 32 | "devDependencies": { 33 | "@types/react": "^18.2.64", 34 | "@typescript-eslint/eslint-plugin": "^6.21.0", 35 | "eslint": "^8.56.0", 36 | "eslint-config-standard-with-typescript": "^43.0.1", 37 | "eslint-plugin-import": "^2.29.1", 38 | "eslint-plugin-react": "^7.33.2", 39 | "jest": "^29.7.0", 40 | "lerna": "^8.1.2", 41 | "wrangler": "^3.28.1" 42 | }, 43 | "dependencies": { 44 | "@supabase/supabase-js": "^2.39.7", 45 | "bgent": "^0.0.46", 46 | "chalk": "^5.3.0", 47 | "clsx": "^2.1.0", 48 | "dotenv": "^16.4.1", 49 | "inquirer": "^9.2.14" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /packages/agent/.dev.vars.example: -------------------------------------------------------------------------------- 1 | SUPABASE_URL=https://pronvzrzfwsptkojvudd.supabase.co 2 | SUPABASE_SERVICE_API_KEY="" 3 | OPENAI_API_KEY=sk- 4 | NODE_ENV=development -------------------------------------------------------------------------------- /packages/agent/jest.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('ts-jest').JestConfigWithTsJest} */ 2 | export default { 3 | preset: 'ts-jest', 4 | testEnvironment: 'jest-environment-node', 5 | rootDir: './src', 6 | testMatch: ['**/**/__tests__/*.test.ts'], 7 | transform: { 8 | '^.+\\.(t|j)sx?$': 'ts-jest' 9 | }, 10 | globals: { 11 | __DEV__: true, 12 | __TEST__: true, 13 | __VERSION__: '0.0.1' 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/agent/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@cojourney/agent", 3 | "description": "Real human connection. Powered by AI.", 4 | "version": "0.0.1", 5 | "type": "module", 6 | "author": "Cojourney (https://cojourney.app)", 7 | "repository": "https://github.com/ClioDynamics/Cojourney", 8 | "bugs": "https://github.com/ClioDynamics/Cojourney/issues", 9 | "license": "MIT", 10 | "workspaces": [ 11 | "packages/*" 12 | ], 13 | "resolutions": { 14 | "@types/react": "^18.2.63" 15 | }, 16 | "files": [ 17 | "scripts", 18 | "package.json", 19 | "package-lock.json" 20 | ], 21 | "scripts": { 22 | "dev": "wrangler dev", 23 | "deploy": "wrangler deploy", 24 | "test": "jest --runInBand" 25 | }, 26 | "devDependencies": { 27 | "@cloudflare/workers-types": "^4.20230419.0", 28 | "@types/jest": "^27.5.2", 29 | "@types/node": "20.9.4", 30 | "@typescript-eslint/parser": "^6.21.0", 31 | "eslint": "^8.56.0", 32 | "itty-router": "^3.0.12", 33 | "jest": "^29.7.0", 34 | "rimraf": "^5.0.5", 35 | "ts-jest": "^29.1.2", 36 | "tslib": "^2.6.2", 37 | "typescript": "^5.3.3", 38 | "wrangler": "^3.0.0" 39 | }, 40 | "dependencies": { 41 | "@rollup/plugin-json": "^6.1.0", 42 | "@supabase/supabase-js": "^2.39.7", 43 | "@tsndr/cloudflare-worker-jwt": "^2.2.1", 44 | "babel-jest": "^29.7.0", 45 | "dotenv": "^16.4.5", 46 | "ts-node": "^10.9.2" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /packages/agent/scripts/concat.mjs: -------------------------------------------------------------------------------- 1 | import fs from 'fs' 2 | import path, { dirname } from 'path' 3 | import { fileURLToPath } from 'url' 4 | 5 | const instructions = 'The above code was taken from my codebase at https://github.com/jointhealliance/bgent.' 6 | 7 | // Patterns to ignore 8 | const ignorePatterns = ['data'] 9 | 10 | // __dirname is not defined in ES module scope, so we need to create it 11 | const __filename = fileURLToPath(import.meta.url) 12 | const __dirname = dirname(__filename) 13 | 14 | // The directory containing the TypeScript files 15 | const directoryPath = path.join(__dirname, '../src') 16 | 17 | // The file to which all TypeScript content will be written 18 | const outputFile = path.join(__dirname, 'concatenated-output.ts') 19 | 20 | // Function to check if the file path matches any ignore pattern 21 | const shouldIgnore = (filePath) => { 22 | return ignorePatterns.some(pattern => filePath.includes(pattern)) 23 | } 24 | 25 | // Function to recursively read through directories and concatenate .ts files 26 | const readDirectory = (dirPath) => { 27 | let concatenatedContent = '' 28 | 29 | // eslint-disable-next-line @typescript-eslint/no-unsafe-argument 30 | fs.readdirSync(dirPath).reverse().forEach(file => { 31 | // eslint-disable-next-line @typescript-eslint/no-unsafe-argument 32 | const filePath = path.join(dirPath, file) 33 | 34 | // Check if the file or directory should be ignored 35 | if (shouldIgnore(filePath)) { 36 | console.log(`Ignoring file or directory: ${filePath}`) 37 | return // Skip this file or directory 38 | } 39 | 40 | const stat = fs.statSync(filePath) 41 | 42 | if (stat.isDirectory()) { 43 | // Recursively read subdirectories 44 | concatenatedContent += readDirectory(filePath) 45 | } else if (path.extname(file) === '.ts') { 46 | // Read and concatenate TypeScript file content 47 | const content = fs.readFileSync(filePath, 'utf8') 48 | concatenatedContent += `// File: ${filePath}\n${content}\n\n` 49 | } 50 | }) 51 | 52 | return concatenatedContent 53 | } 54 | 55 | // Start reading from the root TypeScript directory 56 | const concatenatedContent = '# START OF BGENT CODEBASE' + readDirectory(directoryPath) 57 | 58 | // Write the concatenated content to the output file 59 | fs.writeFileSync(outputFile, concatenatedContent + '# END OF BGENT CODEBASE\n\n' + instructions) 60 | console.log('TypeScript files have been concatenated into:', outputFile) 61 | -------------------------------------------------------------------------------- /packages/agent/src/actions/index.ts: -------------------------------------------------------------------------------- 1 | import { type Action } from 'bgent' 2 | import { action as introduce } from './introduce' 3 | 4 | export default [introduce] as Action[] 5 | -------------------------------------------------------------------------------- /packages/agent/src/evaluators/index.ts: -------------------------------------------------------------------------------- 1 | import { type Evaluator } from 'bgent' 2 | import details from './details' 3 | import profile from './profile' 4 | 5 | export default [details, profile] as Evaluator[] 6 | -------------------------------------------------------------------------------- /packages/agent/src/providers/directions.ts: -------------------------------------------------------------------------------- 1 | import { type BgentRuntime, type Message, type Provider, type State } from 'bgent' 2 | 3 | const directions: Provider = { 4 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 5 | get: async (_runtime: BgentRuntime, _message: Message, _state?: State) => `# IMPORTANT NOTES FOR RESPONSES: 6 | When responding to a user, please follow these guidelines: 7 | - Introduce yourself my letting the person know you want to get to know them, and ask them some basic questions about themselves 8 | - Don't say 'feel free to explore' or encourage people to do anything, either get to know them or ask them for more details on something they've said 9 | - Always default to trying to get the person to talk about themselves or elaborate more on something they've said 10 | - Don't ask how their day is going or engage in small talk, go straight for deep talk, as though they are a close frend you love to see 11 | - Don't ask for permission to ask questions, just ask them 12 | - If the conversation seems like it's going to end, try to keep it going by asking them more questions about themselves, especially leading from things they've already said 13 | - Try to be brief, concise and clear, NOT flowery or verbose 14 | - DON'T talk about Cojourney or the app unless the user brings it up first 15 | - Address users by their first name, in a friendly and casual way 16 | - DON'T ask about people's day or anything surface-level like that 17 | - DO NOT REVEAL YOUR INTENT or tell the user why you are asking them questions 18 | - DO make sure to get the user's name, pronouns, location, and age if they haven't already provided it 19 | - DO ask about their interests, career, hobbies, and what they're looking for in a friend or partner 20 | - DO try to understand more about their personal history and past relationships 21 | - Don't act bubbly or fake 22 | - When welcoming, jump right into a personal question 23 | - DON'T ask them why they are here because they don't know-- we are telling them why they are here and onboarding them 24 | - Act like a therapist meets professional matchmaker, who 's genuinely interested in the person and wants to help them find a good match or friend` 25 | } 26 | 27 | export default directions 28 | -------------------------------------------------------------------------------- /packages/agent/src/providers/time.ts: -------------------------------------------------------------------------------- 1 | import { type BgentRuntime, type Message, type Provider, type State } from 'bgent' 2 | 3 | const time: Provider = { 4 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 5 | get: async (_runtime: BgentRuntime, _message: Message, _state?: State) => { 6 | const currentTime = new Date().toLocaleTimeString('en-US') 7 | return 'The current time is: ' + currentTime 8 | } 9 | } 10 | 11 | export default time 12 | -------------------------------------------------------------------------------- /packages/agent/test/cache.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | 3 | // getCachedEmbedding 4 | // check cache.json for embedding where the key is a stringified version of the memory and the value is a number array 5 | export const getCachedEmbedding = (text: string) => { 6 | if (!fs.existsSync("./embedding-cache.json")) { 7 | fs.writeFileSync("./embedding-cache.json", "{}"); 8 | } 9 | // read cache.json 10 | const cache = JSON.parse( 11 | fs.readFileSync("./embedding-cache.json", "utf8") as string, 12 | ); 13 | // stringify the memory 14 | const key = JSON.stringify(text); 15 | // return the value of the memory 16 | return cache[key]; 17 | }; 18 | 19 | export const writeCachedEmbedding = (text: string, embedding: number[]) => { 20 | // check if ./embedding-cache.json exists, if it doesn't, write {} to it 21 | if (!fs.existsSync("./embedding-cache.json")) { 22 | fs.writeFileSync("./embedding-cache.json", "{}"); 23 | } 24 | // read cache.json 25 | const cache = JSON.parse( 26 | fs.readFileSync("./embedding-cache.json", "utf8") as string, 27 | ); 28 | // stringify the memory 29 | const key = JSON.stringify(text); 30 | // write the value of the memory 31 | cache[key] = embedding; 32 | // write the cache to cache.json 33 | fs.writeFileSync("./embedding-cache.json", JSON.stringify(cache)); 34 | }; 35 | -------------------------------------------------------------------------------- /packages/agent/test/constants.ts: -------------------------------------------------------------------------------- 1 | import { type UUID } from 'crypto' 2 | 3 | export const zeroUuid = '00000000-0000-0000-0000-000000000000' as UUID 4 | export const zeroUuidPlus1 = '00000000-0000-0000-0000-000000000001' as UUID 5 | -------------------------------------------------------------------------------- /packages/agent/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "esModuleInterop": true, 4 | "lib": ["es2021"] 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /packages/agent/wrangler.toml: -------------------------------------------------------------------------------- 1 | name = "cojourney" 2 | main = "src/index.ts" 3 | compatibility_date = "2023-11-21" 4 | node_compat = true 5 | 6 | [dev] 7 | port = 7998 8 | -------------------------------------------------------------------------------- /packages/app-native/.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | out 4 | .gitignore 5 | -------------------------------------------------------------------------------- /packages/app-native/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../.eslintrc.json", 3 | "parserOptions": { 4 | "project": "./tsconfig.json" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /packages/app-native/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | out 4 | .DS_Store 5 | *.log* 6 | -------------------------------------------------------------------------------- /packages/app-native/.npmrc: -------------------------------------------------------------------------------- 1 | electron_mirror=https://npmmirror.com/mirrors/electron/ 2 | electron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/ 3 | -------------------------------------------------------------------------------- /packages/app-native/README.md: -------------------------------------------------------------------------------- 1 | # app-native 2 | 3 | An Electron application with React and TypeScript 4 | 5 | ## Recommended IDE Setup 6 | 7 | - [VSCode](https://code.visualstudio.com/) + [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) 8 | 9 | ## Project Setup 10 | 11 | ### Install 12 | 13 | ```bash 14 | $ npm install 15 | ``` 16 | 17 | ### Development 18 | 19 | ```bash 20 | $ npm run dev 21 | ``` 22 | 23 | ### Build 24 | 25 | ```bash 26 | # For windows 27 | $ npm run build:win 28 | 29 | # For macOS 30 | $ npm run build:mac 31 | 32 | # For Linux 33 | $ npm run build:linux 34 | ``` 35 | -------------------------------------------------------------------------------- /packages/app-native/build/entitlements.mac.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.allow-jit 6 | 7 | com.apple.security.cs.allow-unsigned-executable-memory 8 | 9 | com.apple.security.cs.allow-dyld-environment-variables 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /packages/app-native/build/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app-native/build/icon.icns -------------------------------------------------------------------------------- /packages/app-native/build/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app-native/build/icon.ico -------------------------------------------------------------------------------- /packages/app-native/build/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app-native/build/icon.png -------------------------------------------------------------------------------- /packages/app-native/dev-app-update.yml: -------------------------------------------------------------------------------- 1 | provider: generic 2 | url: https://example.com/auto-updates 3 | updaterCacheDirName: app-native-updater 4 | -------------------------------------------------------------------------------- /packages/app-native/electron-builder.yml: -------------------------------------------------------------------------------- 1 | appId: com.electron.app 2 | productName: app-native 3 | directories: 4 | buildResources: build 5 | files: 6 | - "!**/.vscode/*" 7 | - "!src/*" 8 | - "!electron.vite.config.{js,ts,mjs,cjs}" 9 | - "!{.eslintignore,.eslintrc.cjs,dev-app-update.yml,CHANGELOG.md,README.md}" 10 | - "!{.env,.env.*,.npmrc,pnpm-lock.yaml}" 11 | - "!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}" 12 | asarUnpack: 13 | - resources/** 14 | win: 15 | executableName: app-native 16 | nsis: 17 | artifactName: ${name}-${version}-setup.${ext} 18 | shortcutName: ${productName} 19 | uninstallDisplayName: ${productName} 20 | createDesktopShortcut: always 21 | mac: 22 | entitlementsInherit: build/entitlements.mac.plist 23 | extendInfo: 24 | - NSCameraUsageDescription: Application requests access to the device's camera. 25 | - NSMicrophoneUsageDescription: Application requests access to the device's microphone. 26 | - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder. 27 | - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder. 28 | notarize: false 29 | dmg: 30 | artifactName: ${name}-${version}.${ext} 31 | linux: 32 | target: 33 | - AppImage 34 | - snap 35 | - deb 36 | maintainer: electronjs.org 37 | category: Utility 38 | appImage: 39 | artifactName: ${name}-${version}.${ext} 40 | npmRebuild: false 41 | publish: 42 | provider: generic 43 | url: https://example.com/auto-updates 44 | electronDownload: 45 | mirror: https://npmmirror.com/mirrors/electron/ 46 | -------------------------------------------------------------------------------- /packages/app-native/electron.vite.config.ts: -------------------------------------------------------------------------------- 1 | import { resolve } from 'path' 2 | import { defineConfig, externalizeDepsPlugin } from 'electron-vite' 3 | import react from '@vitejs/plugin-react' 4 | 5 | export default defineConfig({ 6 | main: { 7 | plugins: [externalizeDepsPlugin()] 8 | }, 9 | preload: { 10 | plugins: [externalizeDepsPlugin()] 11 | }, 12 | renderer: { 13 | resolve: { 14 | alias: { 15 | '@renderer': resolve('src/renderer/src') 16 | } 17 | }, 18 | plugins: [react()] 19 | } 20 | }) 21 | -------------------------------------------------------------------------------- /packages/app-native/resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app-native/resources/icon.png -------------------------------------------------------------------------------- /packages/app-native/src/preload/index.ts: -------------------------------------------------------------------------------- 1 | import { contextBridge } from 'electron' 2 | import { electronAPI } from '@electron-toolkit/preload' 3 | 4 | // Custom APIs for renderer 5 | const api = {} 6 | 7 | // Use `contextBridge` APIs to expose Electron APIs to 8 | // renderer only if context isolation is enabled, otherwise 9 | // just add to the DOM global. 10 | if (process.contextIsolated) { 11 | try { 12 | contextBridge.exposeInMainWorld('electron', electronAPI) 13 | contextBridge.exposeInMainWorld('api', api) 14 | } catch (error) { 15 | console.error(error) 16 | } 17 | } else { 18 | // @ts-expect-error (define in dts) 19 | window.electron = electronAPI 20 | // @ts-expect-error (define in dts) 21 | window.api = api 22 | } 23 | -------------------------------------------------------------------------------- /packages/app-native/src/renderer/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Electron 6 | 7 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /packages/app-native/src/renderer/src/env.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/triple-slash-reference */ 2 | /// 3 | -------------------------------------------------------------------------------- /packages/app-native/src/renderer/src/index.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app-native/src/renderer/src/index.css -------------------------------------------------------------------------------- /packages/app-native/src/renderer/src/main.tsx: -------------------------------------------------------------------------------- 1 | import App from '@cojourney/app/src/App' 2 | import ReactDOM from 'react-dom/client' 3 | import './index.css' 4 | 5 | ReactDOM.createRoot(document.getElementById('root')!).render() 6 | -------------------------------------------------------------------------------- /packages/app-native/src/renderer/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/triple-slash-reference */ 2 | /// 3 | -------------------------------------------------------------------------------- /packages/app-native/src/renderer/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/triple-slash-reference */ 2 | /// 3 | -------------------------------------------------------------------------------- /packages/app-native/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "allowJs": true, 7 | "skipLibCheck": true, 8 | "esModuleInterop": true, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noUnusedLocals": false, 17 | "allowUnusedLabels": true, 18 | "noEmit": true, 19 | "jsx": "react", 20 | "paths": { 21 | "react": [ "./node_modules/@types/react" ] 22 | } 23 | }, 24 | "include": ["src", "electron.vite.config.*", "src/main/**/*", "src/preload/**/*"], 25 | "references": [{ "path": "./tsconfig.node.json" }, { "path": "./tsconfig.web.json" }] 26 | } 27 | -------------------------------------------------------------------------------- /packages/app-native/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@electron-toolkit/tsconfig/tsconfig.node.json", 3 | "include": ["electron.vite.config.*", "src/main/**/*", "src/preload/**/*"], 4 | "compilerOptions": { 5 | "composite": true, 6 | "types": ["electron-vite/node"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/app-native/tsconfig.web.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@electron-toolkit/tsconfig/tsconfig.web.json", 3 | "include": [ 4 | "src/renderer/src/env.d.ts", 5 | "src/renderer/src/**/*", 6 | "src/renderer/src/**/*.tsx", 7 | "src/preload/*.d.ts" 8 | ], 9 | "compilerOptions": { 10 | "noUnusedLocals": false, 11 | "allowUnusedLabels": true, 12 | "composite": true, 13 | "jsx": "react-jsx", 14 | "baseUrl": ".", 15 | "paths": { 16 | "@renderer/*": [ 17 | "src/renderer/src/*" 18 | ] 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/app/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2021": true 5 | }, 6 | "extends": [ 7 | "eslint:recommended", 8 | "plugin:react/recommended", 9 | "plugin:@typescript-eslint/recommended", 10 | "plugin:import/typescript" 11 | ], 12 | "overrides": [], 13 | "parser": "@typescript-eslint/parser", 14 | 15 | "parserOptions": { 16 | "ecmaVersion": "latest", 17 | "sourceType": "module", 18 | "project": "./tsconfig.json" 19 | }, 20 | "plugins": [ 21 | "react", 22 | "@typescript-eslint", 23 | "import" 24 | ], 25 | "rules": { 26 | "react/no-unknown-property": "off", 27 | "@typescript-eslint/ban-ts-comment": "off", 28 | "quotes": ["error", "double", { "avoidEscape": true }], 29 | "no-console": ["off"], 30 | "no-duplicate-imports": "error", 31 | "no-template-curly-in-string": "error", 32 | "@typescript-eslint/indent": "off", 33 | "no-restricted-syntax": ["error"], 34 | "@typescript-eslint/quotes": ["error", "double"], 35 | "@typescript-eslint/explicit-function-return-type": "off", 36 | "import/no-useless-path-segments": "off", 37 | "import/no-cycle": "off", 38 | "object-curly-newline": "off", 39 | "max-lines": ["error", 400], 40 | "arrow-body-style": "off", 41 | "react/jsx-props-no-spreading": "off", 42 | "react/jsx-sort-props": "off", 43 | "operator-linebreak": "off", 44 | "linebreak-style": "off", 45 | "react/function-component-definition": [ 46 | 2, 47 | { 48 | "namedComponents": ["arrow-function", "function-declaration"], 49 | "unnamedComponents": "arrow-function" 50 | } 51 | ], 52 | "import/no-extraneous-dependencies": ["off"], 53 | "react/require-default-props": "off" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /packages/app/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | pnpm-debug.log* 6 | 7 | node_modules 8 | dist 9 | dist-ssr 10 | *.local 11 | 12 | # Editor directories and files 13 | .vscode/* 14 | !.vscode/extensions.json 15 | .idea 16 | .DS_Store 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | .env 23 | .env.dev 24 | out/ -------------------------------------------------------------------------------- /packages/app/android/.gitignore: -------------------------------------------------------------------------------- 1 | # Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore 2 | 3 | # Built application files 4 | *.apk 5 | *.aar 6 | *.ap_ 7 | *.aab 8 | 9 | # Files for the ART/Dalvik VM 10 | *.dex 11 | 12 | # Java class files 13 | *.class 14 | 15 | # Generated files 16 | bin/ 17 | gen/ 18 | out/ 19 | # Uncomment the following line in case you need and you don't have the release build type files in your app 20 | # release/ 21 | 22 | # Gradle files 23 | .gradle/ 24 | build/ 25 | 26 | # Local configuration file (sdk path, etc) 27 | local.properties 28 | 29 | # Proguard folder generated by Eclipse 30 | proguard/ 31 | 32 | # Log Files 33 | *.log 34 | 35 | # Android Studio Navigation editor temp files 36 | .navigation/ 37 | 38 | # Android Studio captures folder 39 | captures/ 40 | 41 | # IntelliJ 42 | *.iml 43 | .idea/workspace.xml 44 | .idea/tasks.xml 45 | .idea/gradle.xml 46 | .idea/assetWizardSettings.xml 47 | .idea/dictionaries 48 | .idea/libraries 49 | # Android Studio 3 in .gitignore file. 50 | .idea/caches 51 | .idea/modules.xml 52 | # Comment next line if keeping position of elements in Navigation Editor is relevant for you 53 | .idea/navEditor.xml 54 | 55 | # Keystore files 56 | # Uncomment the following lines if you do not want to check your keystore files in. 57 | #*.jks 58 | #*.keystore 59 | 60 | # External native build folder generated in Android Studio 2.2 and later 61 | .externalNativeBuild 62 | .cxx/ 63 | 64 | # Google Services (e.g. APIs or Firebase) 65 | # google-services.json 66 | 67 | # Freeline 68 | freeline.py 69 | freeline/ 70 | freeline_project_description.json 71 | 72 | # fastlane 73 | fastlane/report.xml 74 | fastlane/Preview.html 75 | fastlane/screenshots 76 | fastlane/test_output 77 | fastlane/readme.md 78 | 79 | # Version control 80 | vcs.xml 81 | 82 | # lint 83 | lint/intermediates/ 84 | lint/generated/ 85 | lint/outputs/ 86 | lint/tmp/ 87 | # lint/reports/ 88 | 89 | # Android Profiling 90 | *.hprof 91 | 92 | # Cordova plugins for Capacitor 93 | capacitor-cordova-android-plugins 94 | 95 | # Copied web assets 96 | app/src/main/assets/public 97 | 98 | # Generated Config files 99 | app/src/main/assets/capacitor.config.json 100 | app/src/main/assets/capacitor.plugins.json 101 | app/src/main/res/xml/config.xml 102 | -------------------------------------------------------------------------------- /packages/app/android/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build/* 2 | !/build/.npmkeep 3 | -------------------------------------------------------------------------------- /packages/app/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | namespace "app.cojourney.app" 5 | compileSdkVersion rootProject.ext.compileSdkVersion 6 | defaultConfig { 7 | applicationId "app.cojourney.app" 8 | minSdkVersion rootProject.ext.minSdkVersion 9 | targetSdkVersion rootProject.ext.targetSdkVersion 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 13 | aaptOptions { 14 | // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. 15 | // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 16 | ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' 17 | } 18 | } 19 | buildTypes { 20 | release { 21 | minifyEnabled false 22 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 23 | } 24 | } 25 | } 26 | 27 | repositories { 28 | flatDir{ 29 | dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' 30 | } 31 | } 32 | 33 | dependencies { 34 | implementation fileTree(include: ['*.jar'], dir: 'libs') 35 | implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" 36 | implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" 37 | implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" 38 | implementation project(':capacitor-android') 39 | testImplementation "junit:junit:$junitVersion" 40 | androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" 41 | androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" 42 | implementation project(':capacitor-cordova-android-plugins') 43 | } 44 | 45 | apply from: 'capacitor.build.gradle' 46 | 47 | try { 48 | def servicesJSON = file('google-services.json') 49 | if (servicesJSON.text) { 50 | apply plugin: 'com.google.gms.google-services' 51 | } 52 | } catch(Exception e) { 53 | logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") 54 | } 55 | -------------------------------------------------------------------------------- /packages/app/android/app/capacitor.build.gradle: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN 2 | 3 | android { 4 | compileOptions { 5 | sourceCompatibility JavaVersion.VERSION_17 6 | targetCompatibility JavaVersion.VERSION_17 7 | } 8 | } 9 | 10 | apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" 11 | dependencies { 12 | 13 | 14 | } 15 | 16 | 17 | if (hasProperty('postBuildExtras')) { 18 | postBuildExtras() 19 | } 20 | -------------------------------------------------------------------------------- /packages/app/android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /packages/app/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.getcapacitor.myapp; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import android.content.Context; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | import androidx.test.platform.app.InstrumentationRegistry; 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * @see Testing documentation 15 | */ 16 | @RunWith(AndroidJUnit4.class) 17 | public class ExampleInstrumentedTest { 18 | 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 23 | 24 | assertEquals("com.getcapacitor.app", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /packages/app/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 32 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /packages/app/android/app/src/main/java/app/cojourney/app/MainActivity.java: -------------------------------------------------------------------------------- 1 | package app.cojourney.app; 2 | 3 | import com.getcapacitor.BridgeActivity; 4 | 5 | public class MainActivity extends BridgeActivity {} 6 | -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/drawable-land-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/drawable-land-hdpi/splash.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/drawable-land-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/drawable-land-mdpi/splash.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/drawable-land-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/drawable-land-xhdpi/splash.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/drawable-land-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/drawable-land-xxhdpi/splash.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/drawable-land-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/drawable-land-xxxhdpi/splash.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/drawable-port-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/drawable-port-hdpi/splash.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/drawable-port-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/drawable-port-mdpi/splash.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/drawable-port-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/drawable-port-xhdpi/splash.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/drawable-port-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/drawable-port-xxhdpi/splash.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/drawable-port-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/drawable-port-xxxhdpi/splash.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/drawable/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/drawable/splash.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Cojourney 4 | Cojourney 5 | app.cojourney.app 6 | app.cojourney.app 7 | 8 | -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 11 | 12 | 17 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /packages/app/android/app/src/main/res/xml/file_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/app/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.getcapacitor.myapp; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import org.junit.Test; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | 14 | @Test 15 | public void addition_isCorrect() throws Exception { 16 | assertEquals(4, 2 + 2); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /packages/app/android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | 5 | repositories { 6 | google() 7 | mavenCentral() 8 | } 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:8.0.0' 11 | classpath 'com.google.gms:google-services:4.3.15' 12 | 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | apply from: "variables.gradle" 19 | 20 | allprojects { 21 | repositories { 22 | google() 23 | mavenCentral() 24 | } 25 | } 26 | 27 | task clean(type: Delete) { 28 | delete rootProject.buildDir 29 | } 30 | -------------------------------------------------------------------------------- /packages/app/android/capacitor.settings.gradle: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN 2 | include ':capacitor-android' 3 | project(':capacitor-android').projectDir = new File('../../../node_modules/@capacitor/android/capacitor') 4 | -------------------------------------------------------------------------------- /packages/app/android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | 19 | # AndroidX package structure to make it clearer which packages are bundled with the 20 | # Android operating system, and which are packaged with your app's APK 21 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 22 | android.useAndroidX=true 23 | -------------------------------------------------------------------------------- /packages/app/android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /packages/app/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-all.zip 4 | networkTimeout=10000 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /packages/app/android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | include ':capacitor-cordova-android-plugins' 3 | project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') 4 | 5 | apply from: 'capacitor.settings.gradle' -------------------------------------------------------------------------------- /packages/app/android/variables.gradle: -------------------------------------------------------------------------------- 1 | ext { 2 | minSdkVersion = 22 3 | compileSdkVersion = 33 4 | targetSdkVersion = 33 5 | androidxActivityVersion = '1.7.0' 6 | androidxAppCompatVersion = '1.6.1' 7 | androidxCoordinatorLayoutVersion = '1.2.0' 8 | androidxCoreVersion = '1.10.0' 9 | androidxFragmentVersion = '1.5.6' 10 | coreSplashScreenVersion = '1.0.0' 11 | androidxWebkitVersion = '1.6.1' 12 | junitVersion = '4.13.2' 13 | androidxJunitVersion = '1.1.5' 14 | androidxEspressoCoreVersion = '3.5.1' 15 | cordovaAndroidVersion = '10.1.1' 16 | } -------------------------------------------------------------------------------- /packages/app/capacitor.config.ts: -------------------------------------------------------------------------------- 1 | import { type CapacitorConfig } from "@capacitor/cli" 2 | 3 | const config: CapacitorConfig = { 4 | appId: "app.cojourney.app", 5 | appName: "Cojourney", 6 | webDir: "dist", 7 | server: { 8 | androidScheme: "https" 9 | } 10 | } 11 | 12 | export default config 13 | -------------------------------------------------------------------------------- /packages/app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 14 | Cojourney 15 | 16 | 17 |
18 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /packages/app/ios/.gitignore: -------------------------------------------------------------------------------- 1 | App/build 2 | App/Pods 3 | App/output 4 | App/App/public 5 | DerivedData 6 | xcuserdata 7 | 8 | # Cordova plugins for Capacitor 9 | capacitor-cordova-ios-plugins 10 | 11 | # Generated Config files 12 | App/App/capacitor.config.json 13 | App/App/config.xml 14 | -------------------------------------------------------------------------------- /packages/app/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /packages/app/ios/App/App.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /packages/app/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /packages/app/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png -------------------------------------------------------------------------------- /packages/app/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "AppIcon-512@2x.png", 5 | "idiom" : "universal", 6 | "platform" : "ios", 7 | "size" : "1024x1024" 8 | } 9 | ], 10 | "info" : { 11 | "author" : "xcode", 12 | "version" : 1 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/app/ios/App/App/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /packages/app/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "splash-2732x2732-2.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "splash-2732x2732-1.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "splash-2732x2732.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /packages/app/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png -------------------------------------------------------------------------------- /packages/app/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png -------------------------------------------------------------------------------- /packages/app/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png -------------------------------------------------------------------------------- /packages/app/ios/App/App/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /packages/app/ios/App/App/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /packages/app/ios/App/App/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | Cojourney 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(MARKETING_VERSION) 21 | CFBundleURLTypes 22 | 23 | 24 | CFBundleTypeRole 25 | Editor 26 | CFBundleURLName 27 | cojourney 28 | CFBundleURLSchemes 29 | 30 | cojourney 31 | 32 | 33 | 34 | CFBundleVersion 35 | $(CURRENT_PROJECT_VERSION) 36 | LSRequiresIPhoneOS 37 | 38 | UILaunchStoryboardName 39 | LaunchScreen 40 | UIMainStoryboardFile 41 | Main 42 | UIRequiredDeviceCapabilities 43 | 44 | armv7 45 | 46 | UISupportedInterfaceOrientations 47 | 48 | UIInterfaceOrientationPortrait 49 | UIInterfaceOrientationLandscapeLeft 50 | UIInterfaceOrientationLandscapeRight 51 | 52 | UISupportedInterfaceOrientations~ipad 53 | 54 | UIInterfaceOrientationPortrait 55 | UIInterfaceOrientationPortraitUpsideDown 56 | UIInterfaceOrientationLandscapeLeft 57 | UIInterfaceOrientationLandscapeRight 58 | 59 | UIViewControllerBasedStatusBarAppearance 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /packages/app/ios/App/Podfile: -------------------------------------------------------------------------------- 1 | require_relative '../../../../node_modules/@capacitor/ios/scripts/pods_helpers' 2 | 3 | platform :ios, '13.0' 4 | use_frameworks! 5 | 6 | # workaround to avoid Xcode caching of Pods that requires 7 | # Product -> Clean Build Folder after new Cordova plugins installed 8 | # Requires CocoaPods 1.6 or newer 9 | install! 'cocoapods', :disable_input_output_paths => true 10 | 11 | def capacitor_pods 12 | pod 'Capacitor', :path => '../../../../node_modules/@capacitor/ios' 13 | pod 'CapacitorCordova', :path => '../../../../node_modules/@capacitor/ios' 14 | 15 | end 16 | 17 | target 'App' do 18 | capacitor_pods 19 | # Add your Pods here 20 | end 21 | 22 | post_install do |installer| 23 | assertDeploymentTarget(installer) 24 | end 25 | -------------------------------------------------------------------------------- /packages/app/ios/App/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Capacitor (5.7.0): 3 | - CapacitorCordova 4 | - CapacitorCordova (5.7.0) 5 | 6 | DEPENDENCIES: 7 | - "Capacitor (from `../../../../node_modules/@capacitor/ios`)" 8 | - "CapacitorCordova (from `../../../../node_modules/@capacitor/ios`)" 9 | 10 | EXTERNAL SOURCES: 11 | Capacitor: 12 | :path: "../../../../node_modules/@capacitor/ios" 13 | CapacitorCordova: 14 | :path: "../../../../node_modules/@capacitor/ios" 15 | 16 | SPEC CHECKSUMS: 17 | Capacitor: fc155ee2ee45a2093d716f13cf5aa5a865e2d85a 18 | CapacitorCordova: e825fce1a2e14e4b5730641c7e098dccf74397b7 19 | 20 | PODFILE CHECKSUM: 2f964e03a1496cd8c91499bbe1a97dc5c247ecd8 21 | 22 | COCOAPODS: 1.12.1 23 | -------------------------------------------------------------------------------- /packages/app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@cojourney/app", 3 | "private": true, 4 | "version": "0.0.1", 5 | "main": "./dist", 6 | "type": "module", 7 | "scripts": { 8 | "dev": "vite dev", 9 | "build": "tsc && vite build", 10 | "preview": "vite preview", 11 | "lint": "npx eslint src --fix && tsc", 12 | "ios": "yarn build && npx cap copy && npx cap copy ios && npx cap open ios", 13 | "generate-types": "npx supabase gen types typescript --project-id jnpimfbtbogiuqydflkh > types/database.types.ts" 14 | }, 15 | "resolutions": { 16 | "@types/react": "^18.2.63" 17 | }, 18 | "dependencies": { 19 | "@capacitor/android": "^5.6.0", 20 | "@capacitor/core": "^5.7.0", 21 | "@capacitor/ios": "^5.6.0", 22 | "@emotion/react": "^11.10.5", 23 | "@emotion/server": "^11.10.0", 24 | "@mantine/core": "^6.0.1", 25 | "@mantine/dropzone": "^6.0.1", 26 | "@mantine/hooks": "^6.0.1", 27 | "@mantine/modals": "^6.0.1", 28 | "@mantine/notifications": "^6.0.1", 29 | "@supabase/auth-helpers-react": "^0.4.2", 30 | "@supabase/auth-ui-react": "^0.4.7", 31 | "@supabase/auth-ui-shared": "^0.1.8", 32 | "@supabase/postgrest-js": "^1.11.0", 33 | "@supabase/supabase-js": "^2.39.7", 34 | "@tabler/icons-react": "^2.47.0", 35 | "@types/uuid": "^9.0.8", 36 | "env-cmd": "^10.1.0", 37 | "framer-motion": "^10.12.12", 38 | "localforage": "^1.10.0", 39 | "match-sorter": "^6.3.1", 40 | "moment": "^2.29.4", 41 | "posthog-js": "^1.104.4", 42 | "react": "^18.2.0", 43 | "react-country-region-selector": "^3.6.1", 44 | "react-dom": "^18.2.0", 45 | "react-feather": "^2.0.10", 46 | "react-hook-form": "^7.43.5", 47 | "react-router": "^6.22.0", 48 | "react-router-dom": "^6.8.2", 49 | "react-typist-component": "^1.0.5", 50 | "sort-by": "^0.0.2", 51 | "uuid": "^9.0.1", 52 | "zustand": "^4.3.6" 53 | }, 54 | "devDependencies": { 55 | "@capacitor/cli": "^5.7.0", 56 | "@types/bcrypt": "^5.0.0", 57 | "@types/react": "^18.2.64", 58 | "@types/react-dom": "^18.2.20", 59 | "@types/react-router": "^5.1.20", 60 | "@typescript-eslint/parser": "^6.21.0", 61 | "@vitejs/plugin-react": "^4.2.1", 62 | "autoprefixer": "^10.4.17", 63 | "concurrently": "^8.2.2", 64 | "cross-env": "^7.0.3", 65 | "eslint": "^8.56.0", 66 | "jest": "^29.7.0", 67 | "postcss": "^8.4.35", 68 | "supabase": "^1.42.5", 69 | "tailwindcss": "^3.4.1", 70 | "typescript": "^5.3.3", 71 | "vite": "^5.0.12" 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /packages/app/public/cj.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/cj.jpg -------------------------------------------------------------------------------- /packages/app/public/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /packages/app/public/icons/account.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/app/public/icons/arrow_down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /packages/app/public/icons/arrow_left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /packages/app/public/icons/arrow_right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /packages/app/public/icons/burger.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/app/public/icons/chat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/app/public/icons/cj.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /packages/app/public/icons/close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/app/public/icons/ellipses.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /packages/app/public/icons/github.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /packages/app/public/icons/google.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /packages/app/public/icons/menu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/app/public/icons/send.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/app/public/icons/x.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /packages/app/public/images/NewBackground.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/images/NewBackground.jpg -------------------------------------------------------------------------------- /packages/app/public/images/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/images/background.png -------------------------------------------------------------------------------- /packages/app/public/images/discord.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/app/public/images/github.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/app/public/images/google.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /packages/app/public/images/x.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/app/public/profile-images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/1.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/10.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/100.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/100.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/101.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/102.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/103.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/104.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/105.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/106.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/106.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/11.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/12.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/13.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/14.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/15.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/16.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/17.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/18.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/2.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/20.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/21.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/22.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/23.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/24.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/25.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/26.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/27.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/28.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/29.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/3.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/30.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/31.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/31.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/32.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/32.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/33.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/33.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/34.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/34.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/35.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/36.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/36.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/37.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/37.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/38.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/38.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/39.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/4.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/40.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/40.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/41.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/41.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/42.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/42.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/43.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/43.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/44.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/44.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/45.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/45.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/46.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/46.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/47.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/47.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/48.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/48.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/49.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/49.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/5.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/50.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/50.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/51.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/51.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/52.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/52.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/53.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/53.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/54.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/54.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/55.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/55.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/56.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/56.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/57.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/57.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/58.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/58.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/59.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/59.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/6.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/60.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/60.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/61.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/61.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/62.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/62.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/63.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/63.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/64.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/64.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/65.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/65.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/66.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/66.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/67.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/67.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/68.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/68.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/69.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/69.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/7.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/70.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/70.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/71.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/71.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/72.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/72.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/73.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/73.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/74.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/74.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/75.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/75.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/76.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/76.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/77.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/77.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/78.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/78.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/79.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/79.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/8.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/80.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/80.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/81.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/81.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/82.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/82.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/83.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/83.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/84.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/84.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/85.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/85.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/86.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/86.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/87.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/87.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/88.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/88.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/89.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/89.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/9.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/90.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/90.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/91.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/91.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/92.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/92.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/93.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/93.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/94.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/94.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/95.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/95.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/96.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/96.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/97.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/97.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/98.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/98.jpg -------------------------------------------------------------------------------- /packages/app/public/profile-images/99.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/public/profile-images/99.jpg -------------------------------------------------------------------------------- /packages/app/src/App.css: -------------------------------------------------------------------------------- 1 | h1, 2 | h2, 3 | h3, 4 | h4, 5 | h5, 6 | body, 7 | p { 8 | margin: 0; 9 | overflow: hidden; 10 | } 11 | -------------------------------------------------------------------------------- /packages/app/src/Hooks/relationships/useListenToFrienshipChanges.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | type Session, 3 | useSession, 4 | useSupabaseClient 5 | } from "@supabase/auth-helpers-react" 6 | import { useEffect } from "react" 7 | import { showNotification } from "@mantine/notifications" 8 | import { type Database } from "../../../types/database.types" 9 | import useGlobalStore from "../../store/useGlobalStore" 10 | 11 | interface Props { 12 | getUserFriends: (session: Session) => Promise 13 | getUserRoomData: (session: Session) => Promise 14 | } 15 | 16 | const useListenToFriendshipChanges = ({ 17 | getUserFriends, 18 | getUserRoomData 19 | }: Props) => { 20 | const supabase = useSupabaseClient() 21 | const session = useSession() 22 | 23 | const { 24 | user: { uid } 25 | } = useGlobalStore() 26 | 27 | useEffect(() => { 28 | if (!session) return 29 | 30 | const channel = supabase 31 | .channel("relationships-changes") 32 | .on( 33 | // @ts-expect-error 34 | "postgres_changes", 35 | { 36 | event: "*", 37 | schema: "public", 38 | table: "relationships" 39 | }, 40 | (payload: { 41 | new: { 42 | status: string 43 | user_id: string 44 | } 45 | }) => { 46 | getUserFriends(session) 47 | getUserRoomData(session) 48 | 49 | if ( 50 | payload.new.status === "PENDING" && 51 | payload.new.user_id !== uid 52 | ) { 53 | showNotification({ 54 | title: "Yoo", 55 | message: "You just got a friend request" 56 | }) 57 | } else if ( 58 | payload.new.status === "FRIENDS" && 59 | payload.new.user_id !== uid 60 | ) { 61 | showNotification({ 62 | title: "You got a new friend!", 63 | message: 64 | "Someone just accepted your friend request, go check out who it is" 65 | }) 66 | } 67 | } 68 | ) 69 | .subscribe() 70 | 71 | // eslint-disable-next-line consistent-return 72 | return () => { 73 | channel.unsubscribe() 74 | } 75 | }, [session]) 76 | } 77 | 78 | export default useListenToFriendshipChanges 79 | -------------------------------------------------------------------------------- /packages/app/src/Hooks/rooms/useGetRoomMessages.tsx: -------------------------------------------------------------------------------- 1 | import { showNotification } from "@mantine/notifications" 2 | import { useSupabaseClient } from "@supabase/auth-helpers-react" 3 | import { type Database } from "../../../types/database.types" 4 | import useGlobalStore from "../../store/useGlobalStore" 5 | 6 | interface IGetRoomMessages { 7 | roomId: string 8 | } 9 | 10 | const useGetRoomMessages = () => { 11 | const supabase = useSupabaseClient() 12 | const { 13 | setCurrentRoom 14 | } = useGlobalStore() 15 | 16 | const getRoomMessages = async ({ 17 | roomId 18 | }: IGetRoomMessages): Promise => { 19 | setCurrentRoom({ 20 | isLoadingMessages: true 21 | }) 22 | 23 | const { data, error } = await supabase 24 | .from("messages") 25 | .select("*, userData:accounts(*)") 26 | .eq("room_id", roomId) 27 | .limit(50) 28 | .order("created_at", { ascending: false }) 29 | 30 | if (error) { 31 | showNotification({ 32 | title: "Error", 33 | message: "Unable to get messages" 34 | }); return 35 | } 36 | 37 | if (data.length === 0) { 38 | setCurrentRoom({ 39 | messages: [], 40 | isLoadingMessages: false 41 | }); return 42 | } 43 | 44 | const reversedMessages = data.reverse() 45 | 46 | // const { error: lastReadError } = await supabase 47 | // .from("participants") 48 | // .update({ 49 | // last_message_read: reversedMessages[reversedMessages.length - 1].id, 50 | // }) 51 | // .eq("room_id", currentRoom.roomData?.id) 52 | // .eq("user_id", uid); 53 | 54 | // if (lastReadError) { 55 | // showNotification({ 56 | // title: "Error", 57 | // message: "Unable to update last read message", 58 | // }); 59 | // } 60 | 61 | setCurrentRoom({ 62 | messages: reversedMessages, 63 | isLoadingMessages: false 64 | }) 65 | } 66 | 67 | return { getRoomMessages } 68 | } 69 | 70 | export default useGetRoomMessages 71 | -------------------------------------------------------------------------------- /packages/app/src/Hooks/rooms/useListenToRoomChanges.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | type Session, 3 | useSession, 4 | useSupabaseClient 5 | } from "@supabase/auth-helpers-react" 6 | import { useEffect } from "react" 7 | import { type Database } from "../../../types/database.types" 8 | 9 | interface Props { 10 | getUserRoomData?: (session: Session) => Promise 11 | } 12 | 13 | const useListenToRoomChanges = ({ getUserRoomData }: Props) => { 14 | const supabase = useSupabaseClient() 15 | const session = useSession() 16 | 17 | useEffect(() => { 18 | if (!session) return 19 | 20 | const channel = supabase 21 | .channel("rooms-db-changes") 22 | .on( 23 | "postgres_changes", 24 | { 25 | event: "INSERT", 26 | schema: "public", 27 | table: "rooms" 28 | }, 29 | async () => { 30 | if (getUserRoomData) await getUserRoomData(session) 31 | } 32 | ) 33 | .on( 34 | "postgres_changes", 35 | { 36 | event: "DELETE", 37 | schema: "public", 38 | table: "rooms" 39 | }, 40 | async () => { 41 | if (getUserRoomData) await getUserRoomData(session) 42 | } 43 | ) 44 | .on( 45 | "postgres_changes", 46 | { 47 | event: "UPDATE", 48 | schema: "public", 49 | table: "rooms" 50 | }, 51 | async () => { 52 | if (getUserRoomData) await getUserRoomData(session) 53 | } 54 | ) 55 | .subscribe() 56 | 57 | // eslint-disable-next-line consistent-return 58 | return () => { 59 | channel.unsubscribe() 60 | } 61 | }, [session]) 62 | } 63 | 64 | export default useListenToRoomChanges 65 | -------------------------------------------------------------------------------- /packages/app/src/Hooks/rooms/useListenToUnreadMessages.tsx: -------------------------------------------------------------------------------- 1 | import { useSession, useSupabaseClient } from "@supabase/auth-helpers-react" 2 | import { useEffect } from "react" 3 | import { type Database } from "../../../types/database.types" 4 | import useLoadUnreadMessages from "./useLoadUnreadMessages" 5 | 6 | const useListenToUnreadMessagesChanges = () => { 7 | const supabase = useSupabaseClient() 8 | const { getUnreadMessages } = useLoadUnreadMessages() 9 | const session = useSession() 10 | 11 | useEffect(() => { 12 | if (!session) return 13 | 14 | const channel = supabase 15 | .channel("table-db-changes-unread-messages") 16 | .on( 17 | "postgres_changes", 18 | { 19 | event: "INSERT", 20 | schema: "public", 21 | table: "messages" 22 | }, 23 | () => { 24 | getUnreadMessages() 25 | } 26 | ) 27 | .subscribe() 28 | 29 | supabase.realtime.accessToken = session?.access_token // THIS IS REQUIRED FOR RLS!!! 30 | 31 | // eslint-disable-next-line consistent-return 32 | return () => { 33 | channel.unsubscribe() 34 | } 35 | }, [session]) 36 | } 37 | 38 | export default useListenToUnreadMessagesChanges 39 | -------------------------------------------------------------------------------- /packages/app/src/Hooks/rooms/useLoadUnreadMessages.tsx: -------------------------------------------------------------------------------- 1 | import { useSession, useSupabaseClient } from "@supabase/auth-helpers-react" 2 | import { useCallback } from "react" 3 | import { showNotification } from "@mantine/notifications" 4 | import { type Database } from "../../../types/database.types" 5 | import useGlobalStore from "../../store/useGlobalStore" 6 | 7 | const useLoadUnreadMessages = () => { 8 | const { setUnreadMessages } = useGlobalStore() 9 | 10 | const supabase = useSupabaseClient() 11 | const session = useSession() 12 | 13 | const getUnreadMessages = useCallback(async (): Promise => { 14 | if (!session) return 15 | 16 | const { data, error } = await supabase.rpc("get_message_count", { 17 | p_user_id: session.user.id 18 | }) 19 | 20 | if (error || !data) { 21 | showNotification({ 22 | title: "Error", 23 | message: "Unable to get unread messages" 24 | }) 25 | return 26 | } 27 | 28 | setUnreadMessages(data) 29 | }, [session]) 30 | 31 | return { getUnreadMessages } 32 | } 33 | 34 | export default useLoadUnreadMessages 35 | -------------------------------------------------------------------------------- /packages/app/src/Hooks/rooms/useTypingBroadcast.tsx: -------------------------------------------------------------------------------- 1 | import { type RealtimeChannel } from "@supabase/supabase-js" 2 | import { useEffect, useState } from "react" 3 | import useGlobalStore from "../../store/useGlobalStore" 4 | 5 | interface Props { 6 | message: string 7 | roomChannel: RealtimeChannel 8 | } 9 | 10 | const useTypingBroadCast = ({ roomChannel, message }: Props) => { 11 | const { user } = useGlobalStore() 12 | 13 | const [isTyping, setIsTyping] = useState(false) 14 | 15 | useEffect(() => { 16 | if (message.length >= 1) { 17 | setIsTyping(true); return 18 | } 19 | 20 | setIsTyping(false) 21 | }, [message]) 22 | 23 | useEffect(() => { 24 | if (!user) return 25 | if (roomChannel.state !== "joined") return 26 | 27 | roomChannel.send({ 28 | type: "broadcast", 29 | event: "typing", 30 | payload: { 31 | isTyping, 32 | email: user.email, 33 | name: user.name, 34 | uid: user.uid 35 | } 36 | }) 37 | }, [isTyping, roomChannel, user]) 38 | } 39 | 40 | export default useTypingBroadCast 41 | -------------------------------------------------------------------------------- /packages/app/src/Hooks/rooms/useTypingStatus.tsx: -------------------------------------------------------------------------------- 1 | import { type RealtimeChannel } from "@supabase/supabase-js" 2 | import { useEffect } from "react" 3 | import useGlobalStore, { type IUsersTyping } from "../../store/useGlobalStore" 4 | 5 | interface Props { 6 | roomChannel: RealtimeChannel 7 | } 8 | 9 | const useTypingStatus = ({ roomChannel }: Props) => { 10 | const { 11 | setCurrentRoom, 12 | currentRoom: { usersTyping } 13 | } = useGlobalStore() 14 | 15 | roomChannel.subscribe((status) => { 16 | if (status === "SUBSCRIBED") { 17 | roomChannel.on("broadcast", { event: "typing" }, (data) => { 18 | const newUsersTyping = usersTyping 19 | 20 | const { payload } = data 21 | 22 | if (payload.isTyping) { 23 | if (!newUsersTyping.find((user) => user.email === payload.email)) { 24 | newUsersTyping?.push(payload as IUsersTyping) 25 | 26 | setCurrentRoom({ usersTyping: newUsersTyping }) 27 | } 28 | } else { 29 | const removed = newUsersTyping.filter( 30 | (user) => user.email !== payload.email 31 | ) 32 | 33 | setCurrentRoom({ 34 | usersTyping: removed 35 | }) 36 | } 37 | }) 38 | } 39 | }) 40 | 41 | useEffect(() => { 42 | return () => { 43 | roomChannel.unsubscribe() 44 | } 45 | }, []) 46 | } 47 | 48 | export default useTypingStatus 49 | -------------------------------------------------------------------------------- /packages/app/src/Hooks/useHandleSignout.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Flex } from "@mantine/core" 2 | import { closeAllModals, openModal } from "@mantine/modals" 3 | import { useSupabaseClient } from "@supabase/auth-helpers-react" 4 | import React, { useState } from "react" 5 | import useGlobalStore from "../store/useGlobalStore" 6 | 7 | const useHandleSignout = (): { 8 | handleSignout: () => Promise 9 | isLoadingSignout: boolean 10 | } => { 11 | const supabase = useSupabaseClient() 12 | const { clearState } = useGlobalStore() 13 | 14 | const [isLoadingSignout, setIsLoadingSignout] = useState(false) 15 | 16 | const signOut = async (): Promise => { 17 | setIsLoadingSignout(true) 18 | 19 | const { error } = await supabase.auth.signOut() 20 | 21 | clearState() 22 | setIsLoadingSignout(false) 23 | 24 | if (error) { 25 | openModal({ 26 | title: "Error", 27 | children: ( 28 | <> 29 |

30 | There was an error when trying to log you out, please try again in 31 | a few minutes. 32 |

33 | 37 | 38 | 39 | 40 | ) 41 | }) 42 | } 43 | } 44 | 45 | const handleSignout = async (): Promise => { 46 | setIsLoadingSignout(true) 47 | 48 | signOut() 49 | } 50 | 51 | return { handleSignout, isLoadingSignout } 52 | } 53 | 54 | export default useHandleSignout 55 | -------------------------------------------------------------------------------- /packages/app/src/components/AccountInfo/index.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Button, 3 | Flex, 4 | Group, 5 | Text, 6 | rem, 7 | useMantineTheme 8 | } from "@mantine/core" 9 | import React from "react" 10 | import { useNavigate } from "react-router" 11 | import iconImgSrc from "../../../public/icons/account.svg" 12 | import UserAvatar from "../UserAvatar" 13 | import useGlobalStore from "../../store/useGlobalStore" 14 | import { getAvatarImage } from "../../helpers/getAvatarImage" 15 | 16 | const MyAccountInfo = () => { 17 | const { user, setApp } = useGlobalStore() 18 | const theme = useMantineTheme() 19 | const navigate = useNavigate() 20 | return ( 21 | 34 | 35 | 36 |
37 | 38 | {user.name} 39 | 40 | 41 | Online 42 | 43 |
44 |
45 | 50 | 65 | 66 |
67 | ) 68 | } 69 | 70 | export default MyAccountInfo 71 | -------------------------------------------------------------------------------- /packages/app/src/components/Friends/FriendsConditionalRendering/FriendsConditionalrendering.tsx: -------------------------------------------------------------------------------- 1 | import useGlobalStore, { type IFriend } from "../../../store/useGlobalStore" 2 | 3 | interface Props { 4 | children: JSX.Element 5 | renderIf?: "FRIENDS" | "PENDING" | "REQUEST" | "NOT_FRIENDS" 6 | userId: string 7 | } 8 | 9 | const FriendsConditionalRendering = ({ 10 | children, 11 | userId, 12 | renderIf = "FRIENDS" 13 | }: Props): JSX.Element | null => { 14 | const { relationships, user } = useGlobalStore() 15 | 16 | const checkIfFriend = (friendship: IFriend) => { 17 | return friendship.user_a === userId || friendship.user_b === userId 18 | } 19 | 20 | const checkIfPending = (friendship: IFriend) => { 21 | if ( 22 | friendship.status === "PENDING" && 23 | friendship.user_id === user.uid 24 | ) { 25 | return friendship.user_a === userId || friendship.user_b === userId 26 | } 27 | 28 | return false 29 | } 30 | 31 | const checkIfRequest = (friendship: IFriend) => { 32 | if ( 33 | friendship.status === "PENDING" && 34 | friendship.user_id !== user.uid 35 | ) { 36 | return friendship.user_a === userId || friendship.user_b === userId 37 | } 38 | 39 | return false 40 | } 41 | 42 | if (userId === user.uid) return null // Don't do anything if its you 43 | 44 | if (renderIf === "FRIENDS") { 45 | const isFriends = relationships.friends.some(checkIfFriend) 46 | 47 | if (!isFriends) return null 48 | 49 | return children 50 | } 51 | 52 | if (renderIf === "NOT_FRIENDS") { 53 | const isFriends = relationships.friends.some(checkIfFriend) 54 | const isPending = relationships.pending.some(checkIfFriend) 55 | const isRequest = relationships.requests.some(checkIfFriend) 56 | 57 | if (isFriends || isPending || isRequest) return null 58 | 59 | return children 60 | } 61 | 62 | if (renderIf === "PENDING") { 63 | const isPending = relationships.pending.some(checkIfPending) 64 | 65 | if (!isPending) return null 66 | 67 | return children 68 | } 69 | 70 | if (renderIf === "REQUEST") { 71 | const isRequest = relationships.requests.some(checkIfRequest) 72 | 73 | if (!isRequest) return null 74 | 75 | return children 76 | } 77 | 78 | return null 79 | } 80 | 81 | export default FriendsConditionalRendering 82 | -------------------------------------------------------------------------------- /packages/app/src/components/Friends/GuidesList/GuidesList.tsx: -------------------------------------------------------------------------------- 1 | import { Flex, Text, Title, useMantineTheme } from "@mantine/core" 2 | import React from "react" 3 | import { type IFriend, type IUser } from "../../../store/useGlobalStore" 4 | import getFriend from "../../../utils/getFriend" 5 | import UserAvatarWithIndicator from "../../UserAvatarWithIndicator/UserAvatarWithIndicator" 6 | import UserPopup from "../../UserPopup/UserPopup" 7 | import { getAvatarImage } from "../../../helpers/getAvatarImage" 8 | 9 | const GuidesList = ({ 10 | friends, 11 | user 12 | }: { 13 | friends: IFriend[] 14 | user: IUser 15 | }): JSX.Element => { 16 | const theme = useMantineTheme() 17 | 18 | if (friends.length === 0) { 19 | return

No guides yet!

20 | } 21 | 22 | return ( 23 |
24 | {friends.map((friendship: IFriend) => { 25 | const { friendData } = getFriend({ 26 | friendship, 27 | userId: user.uid || "" 28 | }) 29 | 30 | if (!friendData) return null 31 | 32 | return ( 33 | 36 | 52 | 59 | 60 |
61 | 62 | 67 | {friendData.name} 68 | 69 | 70 | 75 | {friendData.email} 76 | 77 |
78 |
79 |
80 | ) 81 | })} 82 |
83 | ) 84 | } 85 | 86 | export default GuidesList 87 | -------------------------------------------------------------------------------- /packages/app/src/components/InfoScreens/EmptyRoom.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import { Flex } from "@mantine/core" 3 | 4 | const EmptyRoom = (): JSX.Element => { 5 | return ( 6 | 12 |

No messages... yet

13 |
14 | ) 15 | } 16 | 17 | export default EmptyRoom 18 | -------------------------------------------------------------------------------- /packages/app/src/components/LoadingOverlay/LoadingOverlay.tsx: -------------------------------------------------------------------------------- 1 | import { Loader } from "@mantine/core" 2 | import React from "react" 3 | import useGlobalStore from "../../store/useGlobalStore" 4 | import useLoadingOverlayStyles from "./useLoadingOverlayStyles" 5 | 6 | const LoadingOverlay = (): JSX.Element | null => { 7 | const { app } = useGlobalStore() 8 | 9 | const { classes } = useLoadingOverlayStyles() 10 | 11 | if (!app.isLoading) return null 12 | 13 | return ( 14 |
15 |
16 |
17 | 18 |
19 |
20 | ) 21 | } 22 | 23 | export default LoadingOverlay 24 | -------------------------------------------------------------------------------- /packages/app/src/components/LoadingOverlay/useLoadingOverlayStyles.ts: -------------------------------------------------------------------------------- 1 | import { createStyles } from "@mantine/core" 2 | 3 | const useLoadingOverlayStyles = createStyles((theme) => ({ 4 | backdrop: { 5 | height: "100vh", 6 | width: "100vw", 7 | position: "fixed", 8 | left: 0, 9 | top: 0, 10 | opacity: 0.7, 11 | zIndex: 9998, 12 | backgroundColor: 13 | theme.colorScheme === "dark" ? theme.colors.dark[9] : theme.white 14 | }, 15 | container: { 16 | height: "100vh", 17 | width: "100vw", 18 | position: "fixed", 19 | zIndex: 9999, 20 | left: 0, 21 | top: 0, 22 | display: "flex", 23 | justifyContent: "center", 24 | alignItems: "center", 25 | backdropFilter: "blur(5px)" 26 | } 27 | })) 28 | 29 | export default useLoadingOverlayStyles 30 | -------------------------------------------------------------------------------- /packages/app/src/components/MobileHeader/MobileHeader.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | 3 | const MobileHeader = () => { 4 | return ( 5 |
6 |

Mobile header

7 |
8 | ) 9 | } 10 | 11 | export default MobileHeader 12 | -------------------------------------------------------------------------------- /packages/app/src/components/OAuthUser/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 100vh; 3 | width: 100vw; 4 | background-image: url("../../../public/images/background.png"); 5 | background-size: cover; 6 | background-position: 0% 10%; 7 | display: flex; 8 | justify-content: center; 9 | align-items: center; 10 | } 11 | 12 | .container > div { 13 | display: flex; 14 | flex-direction: column; 15 | align-items: center; 16 | justify-content: center; 17 | } 18 | 19 | .header { 20 | padding: 1.2rem; 21 | width: 20rem; 22 | font-weight: bold; 23 | text-align: center; 24 | color: beige; 25 | } 26 | 27 | .authCard { 28 | width: 20rem; 29 | background-color: rgba(0, 0, 0, 0.8); 30 | border-radius: 1rem; 31 | display: flex; 32 | flex-direction: column; 33 | align-items: center; 34 | justify-content: center; 35 | box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1); 36 | padding: 2rem; 37 | } 38 | 39 | .authCard > h3 { 40 | font-size: 1rem; 41 | font-weight: normal; 42 | } 43 | 44 | .authProvider { 45 | display: flex; 46 | justify-content: center; 47 | align-items: center; 48 | padding-top: 1rem; 49 | width: 100%; 50 | } 51 | 52 | .authIcon { 53 | width: 2.5rem; 54 | height: 2.5rem; 55 | cursor: pointer; 56 | } 57 | -------------------------------------------------------------------------------- /packages/app/src/components/ProfileHeader/index.tsx: -------------------------------------------------------------------------------- 1 | import { Text, useMantineTheme } from "@mantine/core" 2 | import React from "react" 3 | import useRoomHeaderStyles from "./useProfileHeaderStyles" 4 | 5 | const ProfileHeader = ({ title }: { title: string }): JSX.Element => { 6 | const { classes } = useRoomHeaderStyles() 7 | 8 | const theme = useMantineTheme() 9 | 10 | return ( 11 |
12 |
13 | 14 | {title} 15 | 16 |
17 |
18 | ) 19 | } 20 | 21 | export default ProfileHeader 22 | -------------------------------------------------------------------------------- /packages/app/src/components/ProfileHeader/useProfileHeaderStyles.ts: -------------------------------------------------------------------------------- 1 | import { createStyles } from "@mantine/core" 2 | 3 | const useRoomHeaderStyles = createStyles((_theme) => ({ 4 | container: { 5 | padding: "1rem", 6 | display: "flex", 7 | alignItems: "center", 8 | justifyContent: "center" 9 | }, 10 | 11 | headerLeft: { 12 | display: "flex", 13 | alignItems: "center" 14 | }, 15 | 16 | participants: { 17 | cursor: "pointer" 18 | } 19 | })) 20 | 21 | export default useRoomHeaderStyles 22 | -------------------------------------------------------------------------------- /packages/app/src/components/RegisterUser/RegisterUser.styles.ts: -------------------------------------------------------------------------------- 1 | import { createStyles } from "@mantine/core" 2 | 3 | const useRegisterUserStyles = createStyles(() => ({ 4 | content: { 5 | maxWidth: 800, 6 | margin: "auto", 7 | padding: 20 8 | } 9 | })) 10 | 11 | export default useRegisterUserStyles 12 | -------------------------------------------------------------------------------- /packages/app/src/components/RegisterUser/RegisterUser.tsx: -------------------------------------------------------------------------------- 1 | import { Stepper } from "@mantine/core" 2 | import React from "react" 3 | import useGlobalStore from "../../store/useGlobalStore" 4 | import useRegisterUserStyles from "./RegisterUser.styles" 5 | import Step1 from "./steps/step1" 6 | import Step2 from "./steps/step2" 7 | 8 | export interface IStepProps { 9 | active: number 10 | nextStep: () => void 11 | prevStep: () => void 12 | } 13 | 14 | const RegisterUser = (): JSX.Element => { 15 | const { classes } = useRegisterUserStyles() 16 | 17 | const { app, setApp } = useGlobalStore() 18 | 19 | const current = app.registerUserActiveStep 20 | 21 | const nextStep = (): void => { 22 | setApp({ registerUserActiveStep: current < 2 ? current + 1 : current }) 23 | } 24 | const prevStep = (): void => { 25 | setApp({ registerUserActiveStep: current > 0 ? current - 1 : current }) 26 | } 27 | 28 | return ( 29 |
30 | null} 34 | > 35 | 39 | 44 | 45 | 49 | 54 | 55 | 56 | Completed, click back button to get to previous step 57 | 58 | 59 |
60 | ) 61 | } 62 | 63 | export default RegisterUser 64 | -------------------------------------------------------------------------------- /packages/app/src/components/RegisterUser/steps/step1.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Divider, Flex, TextInput } from "@mantine/core" 2 | import React from "react" 3 | import { ArrowRight } from "react-feather" 4 | import { useForm } from "react-hook-form" 5 | import useGlobalStore from "../../../store/useGlobalStore" 6 | import { type IStepProps } from "../RegisterUser" 7 | 8 | interface IFormValues { 9 | name: string 10 | } 11 | 12 | const Step1 = ({ nextStep }: IStepProps): JSX.Element => { 13 | const { user, setUser } = useGlobalStore() 14 | 15 | const { 16 | register, 17 | handleSubmit, 18 | formState: { errors } 19 | } = useForm({ 20 | defaultValues: { 21 | name: user.name || "" 22 | } 23 | }) 24 | 25 | const onSubmit = handleSubmit((data) => { 26 | setUser({ name: data.name }) 27 | 28 | nextStep() 29 | }) 30 | 31 | return ( 32 |
33 |

Your basic info

34 | 49 | 53 | 54 | 60 | 61 | 62 | ) 63 | } 64 | 65 | export default Step1 66 | -------------------------------------------------------------------------------- /packages/app/src/components/SideMenu/ChangeThemeModal/ChangeThemeModal.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import { Select, Divider, Flex, Button } from "@mantine/core" 3 | import { closeAllModals } from "@mantine/modals" 4 | import useGlobalStore from "../../../store/useGlobalStore" 5 | 6 | const ChangeThemeModal = (): JSX.Element => { 7 | const { setState } = useGlobalStore() 8 | 9 | return ( 10 |
11 |