From 0e2166ff43f6a2d1ef39eb58257649d1ab6b1eee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mustafa=20=C3=87a=C4=9Fr=C4=B1=20G=C3=BCven?= Date: Sun, 16 Jun 2024 00:16:39 +0300 Subject: [PATCH] Initial commit --- .browserslistrc | 4 + .editorconfig | 5 + .eslintrc-auto-import.json | 72 + .eslintrc.js | 10 + .gitattributes | 2 + .gitignore | 24 + .prettierignore | 2 + .prettierrc.json | 20 + README.md | 130 + database.rules.json | 7 + firebase.json | 8 + index.html | 40 + jsconfig.json | 20 + package.json | 46 + public/android-chrome-192x192.png | Bin 0 -> 10721 bytes public/android-chrome-512x512.png | Bin 0 -> 28761 bytes public/apple-touch-icon.png | Bin 0 -> 9768 bytes public/favicon-16x16.png | Bin 0 -> 496 bytes public/favicon-32x32.png | Bin 0 -> 1242 bytes public/favicon.ico | Bin 0 -> 15406 bytes public/site.webmanifest | 1 + src/App.vue | 10 + src/CONSTANTS.js | 54 + src/components/PageContainer.vue | 260 ++ src/components/README.md | 35 + src/components/layout/Sidebar.vue | 98 + src/components/messages/AudioMessage.vue | 21 + src/components/messages/ImageMessage.vue | 20 + src/components/utils/GetErrorSuccess.vue | 30 + src/layouts/README.md | 5 + src/layouts/default.vue | 11 + src/locales/index.js | 3 + src/locales/messages.json | 3 + src/main.js | 27 + src/pages/README.md | 5 + src/pages/audio.vue | 1 + src/pages/image.vue | 1 + src/pages/index.vue | 32 + src/pages/text.vue | 1 + src/plugins/README.md | 3 + src/plugins/i18.js | 12 + src/plugins/index.js | 22 + src/plugins/pinia.js | 21 + src/plugins/router.js | 5 + src/plugins/vuetify.js | 19 + src/router/index.js | 16 + src/services/firebase/database.js | 42 + src/services/firebase/index.js | 3 + src/services/firebase/initialize.js | 14 + src/services/firebase/storage.js | 59 + src/services/index.js | 5 + src/services/openaiService.js | 121 + src/stores/README.md | 5 + src/stores/chat.js | 139 + src/stores/index.js | 3 + src/stores/main.js | 10 + src/stores/message.js | 54 + src/styles/README.md | 3 + src/styles/settings.scss | 13 + src/utils/index.js | 1 + src/utils/time.js | 26 + storage.rules | 12 + vite.config.mjs | 59 + yarn.lock | 2941 ++++++++++++++++++++++ 64 files changed, 4616 insertions(+) create mode 100644 .browserslistrc create mode 100644 .editorconfig create mode 100644 .eslintrc-auto-import.json create mode 100644 .eslintrc.js create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 README.md create mode 100644 database.rules.json create mode 100644 firebase.json create mode 100644 index.html create mode 100644 jsconfig.json create mode 100644 package.json create mode 100644 public/android-chrome-192x192.png create mode 100644 public/android-chrome-512x512.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon-16x16.png create mode 100644 public/favicon-32x32.png create mode 100644 public/favicon.ico create mode 100644 public/site.webmanifest create mode 100644 src/App.vue create mode 100644 src/CONSTANTS.js create mode 100644 src/components/PageContainer.vue create mode 100644 src/components/README.md create mode 100644 src/components/layout/Sidebar.vue create mode 100644 src/components/messages/AudioMessage.vue create mode 100644 src/components/messages/ImageMessage.vue create mode 100644 src/components/utils/GetErrorSuccess.vue create mode 100644 src/layouts/README.md create mode 100644 src/layouts/default.vue create mode 100644 src/locales/index.js create mode 100644 src/locales/messages.json create mode 100644 src/main.js create mode 100644 src/pages/README.md create mode 100644 src/pages/audio.vue create mode 100644 src/pages/image.vue create mode 100644 src/pages/index.vue create mode 100644 src/pages/text.vue create mode 100644 src/plugins/README.md create mode 100644 src/plugins/i18.js create mode 100644 src/plugins/index.js create mode 100644 src/plugins/pinia.js create mode 100644 src/plugins/router.js create mode 100644 src/plugins/vuetify.js create mode 100644 src/router/index.js create mode 100644 src/services/firebase/database.js create mode 100644 src/services/firebase/index.js create mode 100644 src/services/firebase/initialize.js create mode 100644 src/services/firebase/storage.js create mode 100644 src/services/index.js create mode 100644 src/services/openaiService.js create mode 100644 src/stores/README.md create mode 100644 src/stores/chat.js create mode 100644 src/stores/index.js create mode 100644 src/stores/main.js create mode 100644 src/stores/message.js create mode 100644 src/styles/README.md create mode 100644 src/styles/settings.scss create mode 100644 src/utils/index.js create mode 100644 src/utils/time.js create mode 100644 storage.rules create mode 100644 vite.config.mjs create mode 100644 yarn.lock diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..dc3bc09 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,4 @@ +> 1% +last 2 versions +not dead +not ie 11 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7053c49 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,5 @@ +[*.{js,jsx,ts,tsx,vue}] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json new file mode 100644 index 0000000..dcf85eb --- /dev/null +++ b/.eslintrc-auto-import.json @@ -0,0 +1,72 @@ +{ + "globals": { + "Component": true, + "ComponentPublicInstance": true, + "ComputedRef": true, + "EffectScope": true, + "ExtractDefaultPropTypes": true, + "ExtractPropTypes": true, + "ExtractPublicPropTypes": true, + "InjectionKey": true, + "PropType": true, + "Ref": true, + "VNode": true, + "WritableComputedRef": true, + "computed": true, + "createApp": true, + "customRef": true, + "defineAsyncComponent": true, + "defineComponent": true, + "effectScope": true, + "getCurrentInstance": true, + "getCurrentScope": true, + "h": true, + "inject": true, + "isProxy": true, + "isReactive": true, + "isReadonly": true, + "isRef": true, + "markRaw": true, + "nextTick": true, + "onActivated": true, + "onBeforeMount": true, + "onBeforeRouteLeave": true, + "onBeforeRouteUpdate": true, + "onBeforeUnmount": true, + "onBeforeUpdate": true, + "onDeactivated": true, + "onErrorCaptured": true, + "onMounted": true, + "onRenderTracked": true, + "onRenderTriggered": true, + "onScopeDispose": true, + "onServerPrefetch": true, + "onUnmounted": true, + "onUpdated": true, + "provide": true, + "reactive": true, + "readonly": true, + "ref": true, + "resolveComponent": true, + "shallowReactive": true, + "shallowReadonly": true, + "shallowRef": true, + "toRaw": true, + "toRef": true, + "toRefs": true, + "toValue": true, + "triggerRef": true, + "unref": true, + "useAttrs": true, + "useCssModule": true, + "useCssVars": true, + "useLink": true, + "useRoute": true, + "useRouter": true, + "useSlots": true, + "watch": true, + "watchEffect": true, + "watchPostEffect": true, + "watchSyncEffect": true + } +} diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..6e7e1b1 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,10 @@ +module.exports = { + root: true, + env: { + node: true, + }, + extends: [ + 'plugin:vue/vue3-essential', + 'eslint:recommended', + ], +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..00272c3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +.DS_Store +node_modules +/dist + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +.env +.firebaserc diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..db4c6d9 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +dist +node_modules \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..b969984 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,20 @@ +{ + "arrowParens": "avoid", + "bracketSpacing": true, + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxBracketSameLine": false, + "jsxSingleQuote": true, + "printWidth": 120, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false, + "vueIndentScriptAndStyle": false, + "endOfLine": "lf", + "singleAttributePerLine": true +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..2140d2d --- /dev/null +++ b/README.md @@ -0,0 +1,130 @@ +# 🌟 Vue ChatGPT AI + +✨ Powered by Modern Technologies + +- **Vue 3**: The versatile powerhouse that makes building dynamic user interfaces a breeze. +- **Vuetify 3**: Elevate your design with the elegance of Material Design, right at your fingertips. +- **Pinia**: Your go-to state management solution, as easy as pie, and just as satisfying. +- **Vite**: Lightning-fast build tool that ensures your development experience is as smooth as silk. +- **Firebase**: Real-time magic for your database and storage needs, ensuring your data is always in sync. +- **OpenAI**: The brains behind the operation, bringing sophisticated AI chat capabilities to your app. + +This project harnesses these cutting-edge technologies to deliver a seamless and responsive chat interface, enriched with AI-driven interactions. Enjoy the power of real-time data, sleek design, and intelligent conversation in one cohesive package. + +https://github.com/mustafacagri/vue3-chatgpt-ai-initial/assets/7488394/1fd4179b-f5d6-41a4-b2e4-4f1fc4b91a41 + +## 🚀 Features + +1. **Real-time AI Chat** + + - **OpenAI Integration**: Leverage the power of OpenAI's ChatGPT for intelligent and dynamic conversations. + - **Seamless Interaction**: Chat with the AI in real-time, with instant responses and fluid interaction. + +2. **Multi-format Support** + + - **Text Messages**: Exchange plain text messages effortlessly. + - **Image Support**: Send and receive images directly in the chat. + - **Audio Messages**: Record and share audio clips with ease. + +3. **Persistent Chat History** + + - **Local Storage**: Messages are saved locally, ensuring chat history is retained even after the page refreshes. + - **Firebase Realtime Database**: Store messages in the cloud for access across multiple devices. + +4. **User-friendly Interface** + + - **Vuetify 3**: Aesthetic and intuitive design with Material Design components. + - **Responsive Layout**: Optimized for both desktop and mobile devices. + +5. **State Management** + + - **Pinia**: Simplified and intuitive state management for maintaining the chat application state. + +6. **Efficient Development Workflow** + + - **Vite**: Fast build tool for an efficient development experience. + - **Modular Code Structure**: Clean and maintainable codebase with Vue 3's Composition API. + +7. **Security and Scalability** + + - **Firebase Authentication**: Secure user authentication to protect chat data. + - **Scalable Infrastructure**: Firebase backend ensures scalability and reliability as the user base grows. + +8. **File Management** + - **Firebase Storage**: Store and manage images and audio files securely in the cloud. + +## 🛠️ Setup Instructions + +### Cloning and Running Locally + +To get started, clone the repository and run the development server: + +```bash +git clone https://github.com/your/repository.git +cd repository-name +yarn install +yarn dev +``` + +The application will be running at http://localhost:5017/. + +### 🔥 Firebase Integration + +To fully utilize Firebase features: + +1. **Create a Firebase Project:** + + - Navigate to the [Firebase Console](https://console.firebase.google.com/) and create a new project. + +2. **Enable Firebase Services:** + + - In your Firebase project settings, enable Firebase Storage to store files like images and audio. + +3. **Obtain Firebase Configuration:** + - Go to your Firebase project settings and find the Firebase SDK snippet. You'll need to copy the configuration details including: + - `apiKey` + - `authDomain` + - `databaseURL` + - `projectId` + - `storageBucket` + - `messagingSenderId` + - `appId` +4. **Add Firebase Configuration to `.env` File:** + - Create a `.env` file in the root directory of your project if it doesn't exist. + - Add your Firebase configuration details to the `.env` file using the following format: + ```env + VITE_FIREBASE_API_KEY=your-firebase-api-key + VITE_FIREBASE_AUTH_DOMAIN=your-auth-domain + VITE_FIREBASE_DATABASE_URL=your-database-url + VITE_FIREBASE_PROJECT_ID=your-firebase-project-id + VITE_FIREBASE_STORAGE_BUCKET=your-firebase-storage-bucket + VITE_FIREBASE_MESSAGING_SENDER_ID=your-messaging-sender-id + VITE_FIREBASE_APP_ID=your-firebase-app-id + ``` + +### 🗄️ Local Storage + +Messages are stored in local storage using the `useStorage` hook from `@vueuse/core`. This ensures that chat history persists even when the page is refreshed. + +### 🤖 How to Obtain OpenAI API Key + +1. **Sign up for OpenAI API:** + + - Go to the [OpenAI website](https://www.openai.com/) and sign up for an account. + +2. **Generate API Key:** + + - After signing in, navigate to your account settings or API section to generate a new API key specifically for ChatGPT. + - Copy the generated API key. + +3. **Add OpenAI API Key to `.env` File:** + - Open or create the `.env` file in your project directory. + - Add your OpenAI API key to the `.env` file using the following format: + ```env + VITE_OPENAI_API_KEY=your-openai-api-key + ``` + +## How can I support? 🌟 + +- ⭐ Star my GitHub repo +- 🛠 Create pull requests, submit bugs, suggest new features or updates diff --git a/database.rules.json b/database.rules.json new file mode 100644 index 0000000..f54493d --- /dev/null +++ b/database.rules.json @@ -0,0 +1,7 @@ +{ + /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */ + "rules": { + ".read": false, + ".write": false + } +} \ No newline at end of file diff --git a/firebase.json b/firebase.json new file mode 100644 index 0000000..a4cf09a --- /dev/null +++ b/firebase.json @@ -0,0 +1,8 @@ +{ + "database": { + "rules": "database.rules.json" + }, + "storage": { + "rules": "storage.rules" + } +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..d0a1b85 --- /dev/null +++ b/index.html @@ -0,0 +1,40 @@ + + + + + + Vue - ChatGPT AI + + + + + + + +
+ + + diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..dad0634 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "allowJs": true, + "target": "es5", + "module": "esnext", + "baseUrl": "./", + "moduleResolution": "bundler", + "paths": { + "@/*": [ + "src/*" + ] + }, + "lib": [ + "esnext", + "dom", + "dom.iterable", + "scripthost" + ] + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..366e973 --- /dev/null +++ b/package.json @@ -0,0 +1,46 @@ +{ + "name": "vue3-chatgpt-ai", + "version": "0.0.1", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "lint": "eslint . --fix --ignore-path .gitignore" + }, + "dependencies": { + "@firebase/app": "^0.10.3", + "@firebase/database": "^1.0.5", + "@firebase/storage": "^0.12.5", + "@mdi/font": "7.4.47", + "@vueuse/core": "^10.9.0", + "core-js": "^3.37.0", + "lodash": "^4.17.21", + "moment": "^2.30.1", + "openai": "^4.45.0", + "roboto-fontface": "*", + "vite-plugin-pages": "^0.32.1", + "vue": "^3.4.27", + "vue-i18n": "^9.13.1", + "vuetify": "^3.6.5" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.0.4", + "eslint": "^9.2.0", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-n": "^17.6.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-vue": "^9.26.0", + "pinia": "^2.1.7", + "sass": "^1.77.1", + "unplugin-auto-import": "^0.17.6", + "unplugin-fonts": "^1.1.1", + "unplugin-vue-components": "^0.27.0", + "unplugin-vue-router": "^0.8.6", + "vite": "^5.2.11", + "vite-plugin-vue-layouts": "^0.11.0", + "vite-plugin-vuetify": "^2.0.3", + "vue-router": "^4.3.2" + } +} diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..a77328657640529e61ba194d357700868d0bed14 GIT binary patch literal 10721 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 literal 0 HcmV?d00001 diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..b3b0d73b5a1252d02beb3867faf687ea8a841e6d GIT binary patch literal 28761 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 literal 0 HcmV?d00001 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..270d8a8d4d7fb15140b1e0efb4ba745590926948 GIT binary patch literal 9768 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 literal 0 HcmV?d00001 diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..83efc65d2751b7dbc87ff1c5999f22fc6a987ddd GIT binary patch literal 496 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 + + + + + + + + + diff --git a/src/CONSTANTS.js b/src/CONSTANTS.js new file mode 100644 index 0000000..f27ff7e --- /dev/null +++ b/src/CONSTANTS.js @@ -0,0 +1,54 @@ +export default { + defaultPage: 'text', + pages: { + text: 'text', + image: 'image', + audio: 'audio', + }, + defaultModels: { + text: 'gpt-3.5-turbo', + image: 'dall-e-2', + audio: 'tts-1', + }, + image: { + sizes: { 'dall-e-2': ['256x256', '512x512', '1024x1024'], 'dall-e-3': ['1024x1024', '1792x1024', '1024x1792 '] }, + defaultSizes: { 'dall-e-2': '256x256', 'dall-e-3': '1024x1024' }, + }, + audio: { + voices: ['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'], + defaultVoice: 'alloy', + formats: ['mp3', 'opus', 'aac', 'flac', 'wav', 'pcm'], + defaultFormat: 'mp3', + mimeMaps: { + mp3: 'audio/mp3', + opus: 'audio/ogg', + aac: 'audio/aac', + flac: 'audio/flac', + wav: 'audio/wav', + pcm: 'audio/L16', + }, + speeds: [0.25, 1, 4], + defaultSpeed: 1, + }, + models: { + text: [ + 'gpt-3.5-turbo', + 'gpt-3.5-turbo-0125', + 'gpt-3.5-turbo-1106', + 'gpt-3.5-turbo-instruct ', + 'gpt-4-turbo', + 'gpt-4-turbo-2024-04-09', + 'gpt-4-turbo-preview', + 'gpt-4-0125-preview', + 'gpt-4-1106-preview', + 'gpt-4-0613', + 'gpt-4-vision-preview', + 'gpt-4-1106-vision-preview', + 'gpt-4', + 'gpt-4-32k', + 'gpt-4-32k-0613', + ], + image: ['dall-e-2', 'dall-e-3'], + audio: ['tts-1', 'tts-1-hd'], + }, +} diff --git a/src/components/PageContainer.vue b/src/components/PageContainer.vue new file mode 100644 index 0000000..2023e54 --- /dev/null +++ b/src/components/PageContainer.vue @@ -0,0 +1,260 @@ +