├── .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 |
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 |
18 |
--------------------------------------------------------------------------------
/packages/app/public/icons/account.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/app/public/icons/arrow_down.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/packages/app/public/icons/arrow_left.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/packages/app/public/icons/arrow_right.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/packages/app/public/icons/burger.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/app/public/icons/chat.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/app/public/icons/cj.svg:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/packages/app/public/icons/close.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/app/public/icons/ellipses.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/packages/app/public/icons/github.svg:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/packages/app/public/icons/google.svg:
--------------------------------------------------------------------------------
1 |
21 |
--------------------------------------------------------------------------------
/packages/app/public/icons/menu.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/packages/app/public/icons/send.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/packages/app/public/icons/x.svg:
--------------------------------------------------------------------------------
1 |
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 |
4 |
--------------------------------------------------------------------------------
/packages/app/public/images/github.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/packages/app/public/images/google.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/packages/app/public/images/x.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
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 |
44 | )
45 | }
46 |
47 | export default ChangeThemeModal
48 |
--------------------------------------------------------------------------------
/packages/app/src/components/UserAvatar/index.tsx:
--------------------------------------------------------------------------------
1 | import { Avatar, Group } from "@mantine/core"
2 | import React from "react"
3 |
4 | const UserAvatar = ({
5 | src,
6 | online,
7 | size = "sm"
8 | }: {
9 | src: string
10 | online: boolean
11 | size?: string
12 | }) => {
13 | return (
14 | <>
15 | {size === "lg" ? (
16 |
17 |
40 |
41 | ) : (
42 |
43 |
59 |
60 | )}
61 | >
62 | )
63 | }
64 |
65 | export default UserAvatar
66 |
--------------------------------------------------------------------------------
/packages/app/src/components/UserAvatarWithIndicator/UserAvatarWithIndicator.tsx:
--------------------------------------------------------------------------------
1 | import { Avatar, Indicator } from "@mantine/core"
2 | import React, { useEffect, useState } from "react"
3 | import useGlobalStore from "../../store/useGlobalStore"
4 | import constants from "../../constants/constants"
5 |
6 | interface Props {
7 | checkOnline?: boolean
8 | image: string
9 | radius?: number
10 | size: number
11 | user_email: string
12 | }
13 |
14 | const UserAvatarWithIndicator = ({
15 | image,
16 | size,
17 | user_email,
18 | radius,
19 | checkOnline = false
20 | }: Props): JSX.Element => {
21 | const {
22 | app,
23 | app: { onlineUsers }
24 | } = useGlobalStore()
25 |
26 | const [isOnline, setIsOnline] = useState(false)
27 |
28 | useEffect(() => {
29 | if (!checkOnline) return
30 | if (!onlineUsers) return
31 | setIsOnline(false)
32 |
33 | // eslint-disable-next-line consistent-return
34 | Object.keys(onlineUsers).forEach((key) => {
35 | if (key === user_email) {
36 | setIsOnline(true)
37 | }
38 | })
39 | }, [onlineUsers, user_email, app, checkOnline])
40 |
41 | return (
42 |
53 |
58 |
59 | )
60 | }
61 |
62 | export default UserAvatarWithIndicator
63 |
--------------------------------------------------------------------------------
/packages/app/src/components/UserPopup/UserPopup.tsx:
--------------------------------------------------------------------------------
1 | // TODO: Fix to support this
2 |
3 | import React from "react"
4 | import { useNavigate } from "react-router-dom"
5 | import useGlobalStore from "../../store/useGlobalStore"
6 |
7 | interface Props {
8 | children: JSX.Element
9 | }
10 |
11 | const UserPopup = ({ children }: Props): JSX.Element => {
12 | const {
13 | relationships: { friends },
14 | setApp
15 | } = useGlobalStore()
16 |
17 | const navigate = useNavigate()
18 |
19 | return (
20 | {
22 | const friendship = friends.find(x => x.id.toString() === children.key)
23 |
24 | setApp({
25 | secondaryActiveSideMenu: friendship?.room_id,
26 | isMobileMenuOpen: false
27 | })
28 |
29 | navigate(`/chat/${friendship?.room_id}`)
30 | }}
31 | >
32 | {children}
33 |
34 | )
35 | }
36 |
37 | export default UserPopup
38 |
--------------------------------------------------------------------------------
/packages/app/src/constants/constants.ts:
--------------------------------------------------------------------------------
1 | export const isProd = () => {
2 | if (!import.meta.env.NODE_ENV || import.meta.env.NODE_ENV === "development") {
3 | return false
4 | }
5 |
6 | return true
7 | }
8 |
9 | export default {
10 | avatarPlaceholder: (seed: string | number) => {
11 | return `https://api.dicebear.com/6.x/micah/svg?seed=${seed}`
12 | },
13 | supabaseUrl: import.meta.env.VITE_SUPABASE_URL ?? "https://pronvzrzfwsptkojvudd.supabase.co",
14 | supabaseAnonKey: import.meta.env.VITE_SUPABASE_ANON_KEY ??
15 | "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InByb252enJ6ZndzcHRrb2p2dWRkIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MDY4NTYwNDcsImV4cCI6MjAyMjQzMjA0N30.I6_-XrqssUb2SWYg5DjsUqSodNS3_RPoET3-aPdqywM",
16 | posthogApiKey: "phc_zI9MsoTRSrvQoMSHj2lEdlzXN51nbOrdpS5ZUmWGWuU"
17 | }
18 |
--------------------------------------------------------------------------------
/packages/app/src/helpers/functions.ts:
--------------------------------------------------------------------------------
1 | import { Capacitor } from "@capacitor/core"
2 |
3 | export const isSmartphone = Capacitor.getPlatform() === "ios" || Capacitor.getPlatform() === "android"
4 |
--------------------------------------------------------------------------------
/packages/app/src/helpers/getAvatarImage.ts:
--------------------------------------------------------------------------------
1 | export function getAvatarImage (avatar: string): string {
2 | // hash avatar string down to a number between 1 and 106
3 | const hash = avatar.split("").reduce((acc, char) => acc + char.charCodeAt(0), 0)
4 | const number = hash % 106 + 1
5 | return `/profile-images/${number}.jpg`
6 | }
7 |
--------------------------------------------------------------------------------
/packages/app/src/helpers/getUnreadMessagesInDms.ts:
--------------------------------------------------------------------------------
1 | import { type IRoom, type IUnreadMessages } from "./../store/useGlobalStore"
2 |
3 | interface Props {
4 | dms: IRoom[]
5 | unreadMessages: IUnreadMessages[]
6 | }
7 |
8 | const getUnreadMessagesInDms = ({ dms, unreadMessages }: Props) => {
9 | let unread = 0
10 |
11 | unreadMessages.forEach((message) => {
12 | if (dms.find((dm) => dm.id === message.room_id)) {
13 | unread += message.message_count
14 | }
15 | })
16 |
17 | return unread
18 | }
19 |
20 | export default getUnreadMessagesInDms
21 |
--------------------------------------------------------------------------------
/packages/app/src/helpers/getUnreadMessagesInRooms.ts:
--------------------------------------------------------------------------------
1 | import { type IRoom, type IUnreadMessages } from "./../store/useGlobalStore"
2 |
3 | interface Props {
4 | rooms: IRoom[]
5 | unreadMessages: IUnreadMessages[]
6 | }
7 |
8 | const getUnreadMessagesInRooms = ({ unreadMessages, rooms }: Props) => {
9 | let unread = 0
10 |
11 | unreadMessages.forEach((message) => {
12 | if (rooms.find((dm) => dm.id === message.room_id)) {
13 | unread += message.message_count
14 | }
15 | })
16 |
17 | return unread
18 | }
19 |
20 | export default getUnreadMessagesInRooms
21 |
--------------------------------------------------------------------------------
/packages/app/src/helpers/removeTypingIndicatorFromOfflineUsers.ts:
--------------------------------------------------------------------------------
1 | import { type RealtimePresenceState } from "@supabase/supabase-js"
2 | import { type ICurrentRoom, type IUsersTyping } from "../store/useGlobalStore"
3 |
4 | interface Props {
5 | onlineUsers: RealtimePresenceState
6 | setCurrentRoom: (state: Partial) => void
7 | usersTyping: IUsersTyping[]
8 | }
9 |
10 | const removeTypingIndicatorFromOfflineUsers = ({
11 | usersTyping,
12 | onlineUsers,
13 | setCurrentRoom
14 | }: Props) => {
15 | if (!onlineUsers) return
16 | if (!usersTyping) return
17 |
18 | const onlineUsersArr = Object.keys(onlineUsers)
19 | const newUsersTyping = usersTyping
20 |
21 | const removed = newUsersTyping.filter((user) => {
22 | return onlineUsersArr.includes(user.email)
23 | })
24 |
25 | setCurrentRoom({
26 | usersTyping: removed
27 | })
28 | }
29 |
30 | export default removeTypingIndicatorFromOfflineUsers
31 |
--------------------------------------------------------------------------------
/packages/app/src/index.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/app/src/index.css
--------------------------------------------------------------------------------
/packages/app/src/main.tsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import ReactDOM from "react-dom/client"
3 | import "./index.css"
4 |
5 | import App from "./App"
6 |
7 | ReactDOM.createRoot(document.getElementById("root")!).render(
8 |
9 | )
10 |
--------------------------------------------------------------------------------
/packages/app/src/pages/404/Error404.tsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import {
3 | Button,
4 | Container,
5 | Flex,
6 | ScrollArea,
7 | Text,
8 | Title
9 | } from "@mantine/core"
10 | import { Link } from "react-router-dom"
11 | import useError404Styles from "./useError404Styles"
12 |
13 | const Error404 = (): JSX.Element => {
14 | const { classes } = useError404Styles()
15 |
16 | return (
17 |
21 |
22 | 404
23 | Listen here, partner.
24 |
29 | I'm gettin' real tired of this, partner! The blasted page
30 | you're barkin' after, it's up and gone, disappeared
31 | like a damn coyote on a moonless night. Maybe you ain't got your
32 | trail right, or your words are all jumbled, but you're in the
33 | wrong damn place! Ain't no reason for this ruckus but sure as
34 | hell stirs up a storm. Life's a rough ride, not some Sunday
35 | picnic, you gotta grit your teeth, dig your spurs in, and ride the
36 | damn thing! So dust off and buckle up, this ain't the end of the
37 | road. There's a whole wild world out there, a helluva lot bigger
38 | than one measly missing page!
39 |
40 |
41 |
46 |
47 |
53 |
54 |
55 |
59 | There's no more to see here for now
60 |
61 |
62 |
63 |
64 | )
65 | }
66 |
67 | export default Error404
68 |
--------------------------------------------------------------------------------
/packages/app/src/pages/404/useError404Styles.ts:
--------------------------------------------------------------------------------
1 | import { createStyles, rem } from "@mantine/core"
2 |
3 | const useError404Styles = createStyles((theme) => ({
4 | root: {
5 | backgroundColor: theme.fn.variant({
6 | variant: "filled",
7 | color: theme.primaryColor
8 | }).background,
9 | height: "100vh",
10 | paddingTop: rem(120),
11 | paddingBottom: rem(120),
12 | minHeight: "100vh"
13 | },
14 |
15 | label: {
16 | textAlign: "center",
17 | fontWeight: 900,
18 | fontSize: rem(220),
19 | lineHeight: 1,
20 | marginBottom: `calc(${theme.spacing.xl} * 1.5)`,
21 | color: theme.colors[theme.primaryColor][3],
22 |
23 | [theme.fn.smallerThan("sm")]: {
24 | fontSize: rem(120)
25 | }
26 | },
27 |
28 | title: {
29 | fontFamily: `Greycliff CF, ${theme.fontFamily}`,
30 | textAlign: "center",
31 | fontWeight: 900,
32 | fontSize: rem(38),
33 | color: theme.white,
34 |
35 | [theme.fn.smallerThan("sm")]: {
36 | fontSize: rem(32)
37 | }
38 | },
39 |
40 | description: {
41 | maxWidth: rem(840),
42 | margin: "auto",
43 | marginTop: theme.spacing.xl,
44 | marginBottom: `calc(${theme.spacing.xl} * 1.5)`,
45 | color: theme.colors[theme.primaryColor][1]
46 | }
47 | }))
48 |
49 | export default useError404Styles
50 |
--------------------------------------------------------------------------------
/packages/app/src/pages/app/MainLayout.tsx/LayoutStyles.ts:
--------------------------------------------------------------------------------
1 | import { createStyles } from "@mantine/core"
2 |
3 | const useRoomStyles = createStyles(() => ({
4 | layout: {
5 | display: "flex",
6 | overflowY: "auto",
7 | position: "relative",
8 | paddingBottom: "2.5rem",
9 | flexDirection: "column",
10 | width: "100%",
11 | height: "100%",
12 |
13 | "@media (min-width: 768px)": {
14 | paddingTop: 0
15 | },
16 | "@media (min-width: 1024px)": {
17 | paddingLeft: "380px"
18 | }
19 | },
20 | header: {
21 | padding: "1rem",
22 | display: "flex",
23 | alignItems: "center",
24 | justifyContent: "center"
25 | },
26 | headerContainer: {
27 | position: "relative",
28 | borderBottom: "0.0625rem solid #2A2A2A"
29 | }
30 | }))
31 |
32 | export default useRoomStyles
33 |
--------------------------------------------------------------------------------
/packages/app/src/pages/app/MainLayout.tsx/index.tsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import { Flex, Text, useMantineTheme } from "@mantine/core"
3 | import useSideMenuStyles from "./LayoutStyles"
4 | import iconImgSrc from "../../../../public/icons/arrow_left.svg"
5 | import { useMediaQuery } from "@mantine/hooks"
6 | import { useNavigate } from "react-router-dom" // Import the hook
7 |
8 | function index ({
9 | children,
10 | title
11 | }: {
12 | children: React.ReactNode
13 | title: string
14 | }) {
15 | const { classes } = useSideMenuStyles()
16 | const theme = useMantineTheme()
17 | const isMobile = useMediaQuery("(max-width: 900px)")
18 | const nav = useNavigate()
19 | return (
20 |
21 |
27 | {isMobile && (
28 | {
30 | nav(-1)
31 | }}
32 | >
33 |

40 |
41 | )}
42 |
43 |
44 | {title}
45 |
46 |
47 |
48 |
49 |
{children}
50 |
51 | )
52 | }
53 |
54 | export default index
55 |
--------------------------------------------------------------------------------
/packages/app/src/pages/app/Room/LoadingRoomData/LoadingRoomData.tsx:
--------------------------------------------------------------------------------
1 | import { Flex, Skeleton } from "@mantine/core"
2 | import React from "react"
3 | import useRoomStyles from "../useRoomStyles"
4 |
5 | const LoadingRoomData = (): JSX.Element => {
6 | const { classes } = useRoomStyles()
7 | return (
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | )
28 | }
29 |
30 | export default LoadingRoomData
31 |
--------------------------------------------------------------------------------
/packages/app/src/pages/app/Room/Messages/Message/Message.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Flex,
3 | HoverCard,
4 | Text
5 | } from "@mantine/core"
6 | import moment from "moment"
7 | import React from "react"
8 | import UserAvatarWithIndicator from "../../../../../components/UserAvatarWithIndicator/UserAvatarWithIndicator"
9 | import UserPopup from "../../../../../components/UserPopup/UserPopup"
10 | import {
11 | type IDatabaseMessage
12 | } from "../../../../../store/useGlobalStore"
13 | import useMessageStyles from "../useMessageStyles"
14 |
15 | interface Props {
16 | message: IDatabaseMessage
17 | }
18 |
19 | const Message = ({ message }: Props): JSX.Element => {
20 | const { classes } = useMessageStyles()
21 |
22 | return (
23 |
24 |
32 |
33 |
39 |
40 |
41 |
42 |
49 |
50 |
51 |
52 |
53 | {/* @ts-expect-error */}
54 | {`${message.userData.name} - ${moment(
55 | message.created_at
56 | ).fromNow()}`}
57 |
58 | {message.content?.content}
59 |
60 |
61 |
62 |
63 |
64 |
65 | )
66 | }
67 |
68 | export default Message
69 |
--------------------------------------------------------------------------------
/packages/app/src/pages/app/Room/Messages/Messages.tsx:
--------------------------------------------------------------------------------
1 | import { Box, ScrollArea, Skeleton } from "@mantine/core"
2 | import React, { useEffect, useRef } from "react"
3 | import useGlobalStore, {
4 | type IDatabaseMessage
5 | } from "../../../../store/useGlobalStore"
6 |
7 | import { type Content } from "bgent"
8 | import EmptyRoom from "../../../../components/InfoScreens/EmptyRoom"
9 | import Message from "./Message/Message"
10 |
11 | const Messages = ({
12 | userMessage
13 | }: {
14 | userMessage: IDatabaseMessage
15 | }): JSX.Element => {
16 | const messagesEndRef = useRef(null)
17 | const scrollToBottom = () => {
18 | messagesEndRef.current?.scrollIntoView({ behavior: "smooth" })
19 | }
20 | const {
21 | user,
22 | currentRoom: { messages, isLoadingMessages }
23 | } = useGlobalStore()
24 |
25 | useEffect(() => {
26 | setTimeout(() => {
27 | scrollToBottom()
28 | }, 1000)
29 | }, [])
30 |
31 | useEffect(() => {
32 | setTimeout(() => {
33 | scrollToBottom()
34 | }, 100)
35 | }, [messages?.length, userMessage])
36 |
37 | if (isLoadingMessages) {
38 | return (
39 | <>
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | >
48 | )
49 | }
50 |
51 | if (!messages) return Error loading messages
52 | if (messages.length === 0) return
53 |
54 | const filteredMessages = (
55 | userMessage
56 | ? [
57 | ...messages.filter(
58 | // filter out messages that match userMessage
59 | (message) => message.content.content !== userMessage.content.content
60 | ),
61 | { ...userMessage, userData: user }
62 | ]
63 | : messages
64 | )
65 | .filter(
66 | // filter any messages where action is NEW_USER
67 | (message) => (message.content as Content).action !== "NEW_USER"
68 | )
69 | .sort(
70 | // sort by created_at
71 | (a, b) =>
72 | new Date(a.created_at!).getTime() - new Date(b.created_at!).getTime()
73 | )
74 |
75 | return (
76 |
77 |
78 | {filteredMessages.map((message) => {
79 | return (
80 |
81 |
82 |
83 | )
84 | })}
85 |
86 |
87 |
88 | )
89 | }
90 |
91 | export default Messages
92 |
--------------------------------------------------------------------------------
/packages/app/src/pages/app/Room/Messages/MessagesFunctions/MessageFunctions.tsx:
--------------------------------------------------------------------------------
1 | import { Edit } from "react-feather"
2 | import React from "react"
3 | import { ActionIcon, Flex, Tooltip } from "@mantine/core"
4 | import useGlobalStore, {
5 | type IDatabaseMessage
6 | } from "../../../../../store/useGlobalStore"
7 |
8 | interface IMessageFunctions {
9 | handleEdit: () => void
10 | message: IDatabaseMessage
11 | }
12 | const MessageFunctions = ({
13 | handleEdit,
14 | message
15 | }: IMessageFunctions): JSX.Element => {
16 | const {
17 | user: { uid }
18 | } = useGlobalStore()
19 |
20 | return (
21 |
22 | {message.user_id === uid && (
23 |
28 |
29 |
30 |
31 |
32 | )}
33 |
34 | )
35 | }
36 |
37 | export default MessageFunctions
38 |
--------------------------------------------------------------------------------
/packages/app/src/pages/app/Room/Messages/useMessageStyles.ts:
--------------------------------------------------------------------------------
1 | import { createStyles } from "@mantine/core"
2 |
3 | const useMessageStyles = createStyles((theme) => ({
4 | messageDiv: {
5 | borderRadius: "0.5rem",
6 | position: "relative",
7 | width: "100%",
8 | paddingLeft: 10,
9 |
10 | "&:hover": {
11 | backgroundColor:
12 | theme.colorScheme === "dark"
13 | ? theme.colors.dark[6]
14 | : theme.colors.gray[1]
15 | }
16 | },
17 | avatarDiv: {
18 | display: "flex"
19 | },
20 | messageFunctionsDiv: {
21 | display: "flex",
22 | alignItems: "center",
23 | height: "100%",
24 | right: 0
25 | },
26 | edit_input: {
27 | width: "calc(100% - 60px)",
28 | zIndex: 9999,
29 | top: 0,
30 | marginBottom: 10,
31 | marginTop: 10
32 | }
33 | }))
34 |
35 | export default useMessageStyles
36 |
--------------------------------------------------------------------------------
/packages/app/src/pages/app/Room/RoomHeader/useRoomHeaderStyles.ts:
--------------------------------------------------------------------------------
1 | import { createStyles } from "@mantine/core"
2 |
3 | const useRoomHeaderStyles = createStyles((_theme) => ({
4 | container: {
5 | padding: "1rem"
6 | },
7 |
8 | headerLeft: {
9 | display: "flex",
10 | alignItems: "center",
11 | justifyContent: "space-between"
12 | },
13 |
14 | participants: {
15 | cursor: "pointer"
16 | }
17 | }))
18 |
19 | export default useRoomHeaderStyles
20 |
--------------------------------------------------------------------------------
/packages/app/src/pages/app/Room/RoomNotFound/RoomNotFound.tsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 |
3 | const RoomNotFound = (): JSX.Element => {
4 | return (
5 |
6 |
Room not found
7 |
8 | The room you are trying to access does not exist or it may have been
9 | deleted.
10 |
11 |
12 | )
13 | }
14 |
15 | export default RoomNotFound
16 |
--------------------------------------------------------------------------------
/packages/app/src/pages/app/Room/index.tsx:
--------------------------------------------------------------------------------
1 | import { useParams } from "react-router-dom"
2 | import React from "react"
3 | import useGlobalStore from "../../../store/useGlobalStore"
4 | import LoadingRoomData from "./LoadingRoomData/LoadingRoomData"
5 | import Room from "./Room"
6 | import RoomNotFound from "./RoomNotFound/RoomNotFound"
7 | import useRoomData from "../../../Hooks/rooms/useRoomData"
8 |
9 | const RoomIndex = (): JSX.Element => {
10 | const { roomId } = useParams()
11 | const { getRoomData } = useRoomData({ roomId })
12 |
13 | const {
14 | currentRoom: { isLoading, roomNotFound }
15 | } = useGlobalStore()
16 |
17 | if (isLoading) return
18 | if (roomNotFound) return
19 |
20 | if (!roomId) return Error: roomId not found
21 |
22 | return (
23 |
27 | )
28 | }
29 |
30 | export default RoomIndex
31 |
--------------------------------------------------------------------------------
/packages/app/src/pages/app/UserProfile/index.styles.ts:
--------------------------------------------------------------------------------
1 | import { createStyles } from "@mantine/core"
2 |
3 | const useProfileStyles = createStyles(() => ({
4 | container: {
5 | padding: 8,
6 | position: "relative",
7 | overflow: "auto",
8 | width: "100%",
9 | height:
10 | "calc(100vh - var(--mantine-header-height, 0rem) - var(--mantine-footer-height, 0rem))"
11 | },
12 | titleContainer: {
13 | flexGrow: 1
14 | },
15 | content: {
16 | height: "100%"
17 | },
18 | select: {
19 | border: "none",
20 | backgroundColor: "#232627",
21 | padding: "1em 1em",
22 | display: "block",
23 | width: "100%",
24 | borderRadius: "10px",
25 | // hide the arrow
26 | WebkitAppearance: "none"
27 | },
28 | input: {
29 | padding: "1.5rem",
30 | border: "1px solid #232627",
31 | borderRadius: "0.8rem",
32 | background: "transparent"
33 | },
34 | logoutButton: {
35 | color: "#f00",
36 | cursor: "pointer",
37 | textAlign: "center"
38 | },
39 | profile_container: {
40 | display: "flex",
41 | paddingLeft: "0.75rem",
42 | paddingRight: "0.75rem",
43 | paddingTop: "1.25rem",
44 | paddingBottom: "1.25rem",
45 | flexDirection: "column",
46 | flexGrow: 1,
47 | width: "100%",
48 | maxWidth: "100%",
49 | height: "0",
50 |
51 | "@media (min-width: 768px)": {
52 | paddingLeft: "1.25rem",
53 | paddingRight: "1.25rem",
54 | paddingTop: "2.5rem"
55 | }
56 | },
57 | headerContainer: {
58 | position: "relative",
59 | borderBottom: "0.0625rem solid #2A2A2A"
60 | }
61 | }))
62 |
63 | export default useProfileStyles
64 |
--------------------------------------------------------------------------------
/packages/app/src/pages/app/useRootStyles.ts:
--------------------------------------------------------------------------------
1 | import { createStyles } from "@mantine/core"
2 |
3 | const useRootStyles = createStyles((theme) => ({
4 | container: {
5 | height: "100vh",
6 | position: "relative",
7 | display: "flex",
8 | flexDirection: "row",
9 | "@media (max-width: 900px)": {
10 | flexDirection: "column"
11 | }
12 | },
13 | content: {
14 | height: "100%",
15 | width: "100%",
16 | paddingTop: 0
17 | },
18 | header: {
19 | width: "100vw",
20 | padding: 15,
21 | display: "flex",
22 | justifyContent: "space-between",
23 | backgroundColor:
24 | theme.colorScheme === "dark"
25 | ? theme.colors.dark[9]
26 | : theme.colors.gray[1],
27 |
28 | borderBottom: `1px solid ${
29 | theme.colorScheme === "dark" ? theme.colors.dark[5] : theme.colors.gray[3]
30 | }`
31 | }
32 | }))
33 |
34 | export default useRootStyles
35 |
--------------------------------------------------------------------------------
/packages/app/src/utils/getFriend.ts:
--------------------------------------------------------------------------------
1 | import { type IDatabaseUser, type IFriend } from "../store/useGlobalStore"
2 |
3 | interface Props {
4 | friendship: IFriend
5 | userId: string
6 | }
7 |
8 | const getFriend = ({
9 | friendship,
10 | userId
11 | }: Props): { friendData: IDatabaseUser | null, status: string | null } => {
12 | if (friendship.user_a === userId) {
13 | if (!Array.isArray(friendship.userData2)) {
14 | return { friendData: friendship.userData2, status: friendship.status }
15 | }
16 | }
17 |
18 | if (friendship.user_b === userId) {
19 | if (!Array.isArray(friendship.userData1)) {
20 | return { friendData: friendship.userData1, status: friendship.status }
21 | }
22 | }
23 |
24 | return { friendData: null, status: null }
25 | }
26 |
27 | export default getFriend
28 |
--------------------------------------------------------------------------------
/packages/app/tailwind.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | content: [
3 | './pages/**/*.{js,ts,jsx,tsx}',
4 | './components/**/*.{js,ts,jsx,tsx}',
5 | './app/**/*.{js,ts,jsx,tsx}',
6 | ],
7 | theme: {
8 | extend: {},
9 | },
10 | plugins: [],
11 | }
12 |
--------------------------------------------------------------------------------
/packages/app/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ESNext",
4 | "useDefineForClassFields": true,
5 | "lib": ["DOM", "DOM.Iterable", "ESNext"],
6 | "allowJs": false,
7 | "skipLibCheck": true,
8 | "esModuleInterop": false,
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", "vite-env.d.ts"],
25 | "references": [{ "path": "./tsconfig.node.json" }]
26 | }
27 |
--------------------------------------------------------------------------------
/packages/app/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "composite": true,
4 | "module": "ESNext",
5 | "moduleResolution": "Node",
6 | "allowSyntheticDefaultImports": true
7 | },
8 | "include": ["vite.config.ts"]
9 | }
10 |
--------------------------------------------------------------------------------
/packages/app/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "rewrites": [
3 | {
4 | "source": "/api/(.*)",
5 | "destination": "/api/$1"
6 | },
7 | {
8 | "source": "/static/(.*)",
9 | "destination": "/static/$1"
10 | },
11 | {
12 | "source": "/public/(.*)",
13 | "destination": "/static/$1"
14 | },
15 | {
16 | "source": "/(.*)",
17 | "destination": "/"
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/packages/app/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | // eslint-disable-next-line @typescript-eslint/triple-slash-reference
2 | ///
3 |
4 | interface ImportMetaEnv {
5 | // Define your environment variables here
6 | readonly VITE_SERVER_URL: string
7 | // Add more environment variables as needed
8 | }
9 |
10 | interface ImportMeta {
11 | readonly env: ImportMetaEnv
12 | }
13 |
--------------------------------------------------------------------------------
/packages/app/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vite";
2 | import react from "@vitejs/plugin-react";
3 |
4 | const buildType = process.env.BUILD_TYPE || 'app';
5 |
6 | export default defineConfig(() => {
7 | if (buildType === 'library') {
8 | return {
9 | plugins: [react()],
10 | build: {
11 | lib: {
12 | entry: 'src/App.tsx', // Path to your main component
13 | name: 'cojourney',
14 | formats: ['es', 'umd'], // Specify library formats
15 | fileName: (format) => `index.${format}.js`
16 | },
17 | rollupOptions: {
18 | // Externalize React to avoid bundling it into your library
19 | external: ['react', 'react-dom'],
20 | output: {
21 | // Configure globals for external dependencies
22 | globals: {
23 | react: 'React',
24 | 'react-dom': 'ReactDOM'
25 | }
26 | }
27 | }
28 | }
29 | };
30 | } else {
31 | return {
32 | build: {
33 | minify: false,
34 | },
35 | plugins: [react()],
36 | base: "/",
37 | server: {
38 | port: 3000,
39 | },
40 | };
41 | }
42 | });
--------------------------------------------------------------------------------
/packages/docs/.gitignore:
--------------------------------------------------------------------------------
1 | # Dependencies
2 | /node_modules
3 |
4 | # Production
5 | /build
6 |
7 | # Generated files
8 | .docusaurus
9 | .cache-loader
10 |
11 | # Misc
12 | .DS_Store
13 | .env.local
14 | .env.development.local
15 | .env.test.local
16 | .env.production.local
17 |
18 | npm-debug.log*
19 |
--------------------------------------------------------------------------------
/packages/docs/.prettierrc.json:
--------------------------------------------------------------------------------
1 | {}
--------------------------------------------------------------------------------
/packages/docs/README.md:
--------------------------------------------------------------------------------
1 | # Website
2 |
3 | This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator.
4 |
5 | ### Installation
6 |
7 | ```
8 | $ npm install
9 | ```
10 |
11 | ### Local Development
12 |
13 | ```
14 | $ npm start
15 | ```
16 |
17 | This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
--------------------------------------------------------------------------------
/packages/docs/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
3 | };
4 |
--------------------------------------------------------------------------------
/packages/docs/docs/intro.md:
--------------------------------------------------------------------------------
1 | ---
2 | sidebar_position: 1
3 | ---
4 |
5 | # Cojourney Intro
6 |
--------------------------------------------------------------------------------
/packages/docs/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@cojourney/docs",
3 | "version": "0.0.0",
4 | "private": true,
5 | "scripts": {
6 | "docusaurus": "docusaurus",
7 | "start": "docusaurus start --no-open",
8 | "dev": "docusaurus start --port 3002 --no-open",
9 | "build": "docusaurus build",
10 | "swizzle": "docusaurus swizzle",
11 | "deploy": "docusaurus deploy",
12 | "clear": "docusaurus clear",
13 | "serve": "docusaurus serve",
14 | "write-translations": "docusaurus write-translations",
15 | "write-heading-ids": "docusaurus write-heading-ids"
16 | },
17 | "dependencies": {
18 | "@docusaurus/core": "3.1.1",
19 | "@docusaurus/preset-classic": "3.1.1",
20 | "@mdx-js/react": "^3.0.0",
21 | "clsx": "^2.0.0",
22 | "prism-react-renderer": "^2.3.0",
23 | "react": "^18.2.0",
24 | "react-dom": "^18.2.0",
25 | "react-router-dom": "^6.22.0"
26 | },
27 | "devDependencies": {
28 | "@docusaurus/module-type-aliases": "3.1.1",
29 | "@docusaurus/types": "3.1.1"
30 | },
31 | "browserslist": {
32 | "production": [
33 | ">0.5%",
34 | "not dead",
35 | "not op_mini all"
36 | ],
37 | "development": [
38 | "last 3 chrome version",
39 | "last 3 firefox version",
40 | "last 5 safari version"
41 | ]
42 | },
43 | "engines": {
44 | "node": ">=18.0"
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/packages/docs/sidebars.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Creating a sidebar enables you to:
3 | - create an ordered group of docs
4 | - render a sidebar for each doc of that group
5 | - provide next/previous navigation
6 |
7 | The sidebars can be generated from the filesystem, or explicitly defined here.
8 |
9 | Create as many sidebars as you want.
10 | */
11 |
12 | // @ts-check
13 |
14 | /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
15 | const sidebars = {
16 | // By default, Docusaurus generates a sidebar from the docs folder structure
17 | tutorialSidebar: [{type: 'autogenerated', dirName: '.'}],
18 | };
19 |
20 | export default sidebars;
21 |
--------------------------------------------------------------------------------
/packages/docs/src/components/HomepageFeatures/index.js:
--------------------------------------------------------------------------------
1 | import clsx from 'clsx'
2 | import Heading from '@theme/Heading'
3 | import styles from './styles.module.css'
4 |
5 | const FeatureList = [
6 | {
7 | title: 'Made By Users',
8 | description: (
9 | <>
10 | Cojourney is open source, community developed and designed to be beautiful and easy to use.
11 | >
12 | )
13 | },
14 | {
15 | title: 'Powered By AI',
16 | description: (
17 | <>
18 | Cojourney is a new kind of social network that uses AI to help you find your people.
19 | >
20 | )
21 | },
22 | {
23 | title: 'For a Better World',
24 | description: (
25 | <>
26 | If you have ideas for how to make better agents for everyone, join us and help make it happen.
27 | >
28 | )
29 | }
30 | ]
31 |
32 | function Feature ({ Svg, title, description }) {
33 | return (
34 |
35 |
44 | {/*
45 |
46 |
*/}
47 |
48 |
{title}
49 |
{description}
50 |
51 |
52 |
53 | )
54 | }
55 |
56 | export default function HomepageFeatures () {
57 | return (
58 |
59 |
60 |
61 | {FeatureList.map((props, idx) => (
62 |
63 | ))}
64 |
65 |
66 |
67 | )
68 | }
69 |
--------------------------------------------------------------------------------
/packages/docs/src/components/HomepageFeatures/styles.module.css:
--------------------------------------------------------------------------------
1 | .features {
2 | display: flex;
3 | align-items: center;
4 | padding: 2rem 0;
5 | width: 100%;
6 | }
7 |
8 | .featureSvg {
9 | height: 200px;
10 | width: 200px;
11 | }
12 |
--------------------------------------------------------------------------------
/packages/docs/src/css/custom.css:
--------------------------------------------------------------------------------
1 | /**
2 | * Any CSS included here will be global. The classic template
3 | * bundles Infima by default. Infima is a CSS framework designed to
4 | * work well for content-centric websites.
5 | */
6 |
7 | /* You can override the default Infima variables here. */
8 | :root {
9 | --ifm-color-primary: #2e8555;
10 | --ifm-color-primary-dark: #29784c;
11 | --ifm-color-primary-darker: #277148;
12 | --ifm-color-primary-darkest: #205d3b;
13 | --ifm-color-primary-light: #33925d;
14 | --ifm-color-primary-lighter: #359962;
15 | --ifm-color-primary-lightest: #3cad6e;
16 | --ifm-code-font-size: 95%;
17 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
18 | }
19 |
20 | /* For readability concerns, you should choose a lighter palette in dark mode. */
21 | [data-theme='dark'] {
22 | --ifm-color-primary: #25c2a0;
23 | --ifm-color-primary-dark: #21af90;
24 | --ifm-color-primary-darker: #1fa588;
25 | --ifm-color-primary-darkest: #1a8870;
26 | --ifm-color-primary-light: #29d5b0;
27 | --ifm-color-primary-lighter: #32d8b4;
28 | --ifm-color-primary-lightest: #4fddbf;
29 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
30 | }
31 |
--------------------------------------------------------------------------------
/packages/docs/src/pages/index.js:
--------------------------------------------------------------------------------
1 | import useDocusaurusContext from '@docusaurus/useDocusaurusContext'
2 | import HomepageFeatures from '@site/src/components/HomepageFeatures'
3 | import Layout from '@theme/Layout'
4 |
5 | import Heading from '@theme/Heading'
6 | import styles from './index.module.css'
7 |
8 | function HomepageHeader() {
9 | const { siteConfig } = useDocusaurusContext()
10 | return (
11 |
12 |
13 |
14 | {siteConfig.title}
15 |
16 |
{siteConfig.tagline}
17 |
18 |
19 | )
20 | }
21 |
22 | export default function Home() {
23 | const { siteConfig } = useDocusaurusContext()
24 | return (
25 |
26 |
29 |
38 |
39 |
40 |
41 |
42 |
43 | )
44 | }
45 |
--------------------------------------------------------------------------------
/packages/docs/src/pages/index.module.css:
--------------------------------------------------------------------------------
1 | /**
2 | * CSS files with the .module.css suffix will be treated as CSS modules
3 | * and scoped locally.
4 | */
5 |
6 | .heroBanner {
7 | padding: 4rem 0;
8 | text-align: center;
9 | position: relative;
10 | overflow: hidden;
11 | }
12 |
13 | @media screen and (max-width: 996px) {
14 | .heroBanner {
15 | padding: 2rem;
16 | }
17 | }
18 |
19 | .buttons {
20 | display: flex;
21 | align-items: center;
22 | justify-content: center;
23 | }
24 |
--------------------------------------------------------------------------------
/packages/docs/src/pages/markdown-page.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Markdown page example
3 | ---
4 |
5 | # Markdown page example
6 |
7 | You don't need React to write simple standalone pages.
8 |
--------------------------------------------------------------------------------
/packages/docs/static/.nojekyll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/docs/static/.nojekyll
--------------------------------------------------------------------------------
/packages/docs/static/img/background.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/docs/static/img/background.jpg
--------------------------------------------------------------------------------
/packages/docs/static/img/banner.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/docs/static/img/banner.jpg
--------------------------------------------------------------------------------
/packages/docs/static/img/cj.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/docs/static/img/cj.jpg
--------------------------------------------------------------------------------
/packages/docs/static/img/cj2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/docs/static/img/cj2.jpg
--------------------------------------------------------------------------------
/packages/docs/static/img/cj3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoinTheAlliance/cojourney/05bc2ff25450927cc28f0ab7f82a119a51b75ef6/packages/docs/static/img/cj3.jpg
--------------------------------------------------------------------------------
/packages/docs/static/img/favicon.svg:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/packages/docs/static/img/logo.svg:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/scripts/requests.md:
--------------------------------------------------------------------------------
1 | curl -X POST http://localhost:7998/api/agents/newuser \
2 | -H "Content-Type: application/json" \
3 | -d '{"token": "", "user_id": "0e12a182-27e0-4339-98ad-4f70405f7c44"}'
4 |
5 | curl -X POST http://localhost:7998/api/agents/message \
6 | -H "Content-Type: application/json" \
7 | -d '{"token": "", "senderId": "18322518-fded-400f-a83d-c40732d7c9df", "agentId": "00000000-0000-0000-0000-000000000000", "room_id": "628fc3ba-b8f5-4b98-9347-92fab4f2551e", "content": { "content": "Hello!", "action": "WAIT" } }'
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {}
2 |
--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }]
3 | }
--------------------------------------------------------------------------------