From f466751f4db7e2be00b8f19b905ad1334b0550f4 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Tue, 7 Nov 2023 10:17:28 -0800 Subject: [PATCH] Expose card on web app config page to manage subscription to Khoj cloud --- .../web/assets/icons/credit-card.png | Bin 0 -> 19662 bytes src/khoj/interface/web/base_config.html | 2 +- src/khoj/interface/web/config.html | 48 ++++++++++++++++++ src/khoj/routers/web_client.py | 18 +++++-- 4 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 src/khoj/interface/web/assets/icons/credit-card.png diff --git a/src/khoj/interface/web/assets/icons/credit-card.png b/src/khoj/interface/web/assets/icons/credit-card.png new file mode 100644 index 0000000000000000000000000000000000000000..487dba5cba37abdf841658991bc866241a57e7a3 GIT binary patch literal 19662 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 VmrLoXMb!WR002ovPDHLkV1l4=hU5SM literal 0 HcmV?d00001 diff --git a/src/khoj/interface/web/base_config.html b/src/khoj/interface/web/base_config.html index 619c34c0..001ebef8 100644 --- a/src/khoj/interface/web/base_config.html +++ b/src/khoj/interface/web/base_config.html @@ -229,7 +229,7 @@ text-align: right; } - button.card-button.happy { + .card-button.happy { color: var(--leaf); } diff --git a/src/khoj/interface/web/config.html b/src/khoj/interface/web/config.html index 5a2089ca..5269065d 100644 --- a/src/khoj/interface/web/config.html +++ b/src/khoj/interface/web/config.html @@ -157,6 +157,42 @@ + +
+

Billing

+
+
+
+ Credit Card +

+ Subscription + Configured +

+
+
+

Manage your subscription to Khoj Cloud

+
+ {% if not is_subscribed %} + + {% else %} +
+ +
+ {% endif %} +
+
@@ -222,6 +258,18 @@ }) }; + function unsubscribe() { + fetch('/api/subscription', { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + "email": "{{ username }}" + }) + }) + } + var configure = document.getElementById("configure"); configure.addEventListener("click", function(event) { event.preventDefault(); diff --git a/src/khoj/routers/web_client.py b/src/khoj/routers/web_client.py index 3e568bc7..b49404a2 100644 --- a/src/khoj/routers/web_client.py +++ b/src/khoj/routers/web_client.py @@ -1,4 +1,5 @@ # System Packages +from datetime import datetime import json import os @@ -8,6 +9,7 @@ from fastapi import Request from fastapi.responses import HTMLResponse, FileResponse, RedirectResponse from fastapi.templating import Jinja2Templates from starlette.authentication import requires +from database.models import KhojUser from khoj.utils.rawconfig import ( GithubContentConfig, GithubRepoConfig, @@ -16,7 +18,13 @@ from khoj.utils.rawconfig import ( # Internal Packages from khoj.utils import constants, state -from database.adapters import EntryAdapters, get_user_github_config, get_user_notion_config, ConversationAdapters +from database.adapters import ( + EntryAdapters, + get_user_github_config, + get_user_notion_config, + ConversationAdapters, + is_user_subscribed, +) # Initialize Router web_client = APIRouter() @@ -108,8 +116,10 @@ def login_page(request: Request): @web_client.get("/config", response_class=HTMLResponse) @requires(["authenticated"], redirect="login_page") def config_page(request: Request): - user = request.user.object + user: KhojUser = request.user.object user_picture = request.session.get("user", {}).get("picture") + user_is_subscribed = is_user_subscribed(user.email) + days_to_renewal = (user.subscription_renewal_date - datetime.now()).days if user.subscription_renewal_date else 0 enabled_content_source = set(EntryAdapters.get_unique_file_source(user).all()) successfully_configured = { @@ -131,10 +141,12 @@ def config_page(request: Request): "request": request, "current_model_state": successfully_configured, "anonymous_mode": state.anonymous_mode, - "username": user.username if user else None, + "username": user.username, "conversation_options": all_conversation_options, "selected_conversation_config": selected_conversation_config.id if selected_conversation_config else None, "user_photo": user_picture, + "is_subscribed": user_is_subscribed, + "days_to_renewal": days_to_renewal, }, )