Merge branch 'main' into hosted
This commit is contained in:
commit
46fdd36f11
27
backend/access_token.py
Normal file
27
backend/access_token.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import json
|
||||||
|
import os
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
|
||||||
|
async def validate_access_token(access_code: str):
|
||||||
|
async with httpx.AsyncClient() as client:
|
||||||
|
url = (
|
||||||
|
"https://backend.buildpicoapps.com/screenshot_to_code/validate_access_token"
|
||||||
|
)
|
||||||
|
data = json.dumps(
|
||||||
|
{
|
||||||
|
"access_code": access_code,
|
||||||
|
"secret": os.environ.get("PICO_BACKEND_SECRET"),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
headers = {"Content-Type": "application/json"}
|
||||||
|
|
||||||
|
response = await client.post(url, content=data, headers=headers)
|
||||||
|
response_data = response.json()
|
||||||
|
|
||||||
|
if response_data["success"]:
|
||||||
|
print("Access token is valid.")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print(f"Access token validation failed: {response_data['failure_reason']}")
|
||||||
|
return False
|
||||||
@ -1,6 +1,5 @@
|
|||||||
# Load environment variables first
|
# Load environment variables first
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from pydantic import BaseModel
|
|
||||||
|
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
@ -16,6 +15,7 @@ from mock import mock_completion
|
|||||||
from image_generation import create_alt_url_mapping, generate_images
|
from image_generation import create_alt_url_mapping, generate_images
|
||||||
from prompts import assemble_prompt
|
from prompts import assemble_prompt
|
||||||
from routes import screenshot
|
from routes import screenshot
|
||||||
|
from access_token import validate_access_token
|
||||||
|
|
||||||
app = FastAPI(openapi_url=None, docs_url=None, redoc_url=None)
|
app = FastAPI(openapi_url=None, docs_url=None, redoc_url=None)
|
||||||
|
|
||||||
@ -79,13 +79,27 @@ async def stream_code(websocket: WebSocket):
|
|||||||
|
|
||||||
# Get the OpenAI API key from the request. Fall back to environment variable if not provided.
|
# Get the OpenAI API key from the request. Fall back to environment variable if not provided.
|
||||||
# If neither is provided, we throw an error.
|
# If neither is provided, we throw an error.
|
||||||
if params["openAiApiKey"]:
|
openai_api_key = None
|
||||||
openai_api_key = params["openAiApiKey"]
|
if "accessCode" in params and params["accessCode"]:
|
||||||
print("Using OpenAI API key from client-side settings dialog")
|
print("Access code - using platform API key")
|
||||||
|
if await validate_access_token(params["accessCode"]):
|
||||||
|
openai_api_key = os.environ.get("PLATFORM_OPENAI_API_KEY")
|
||||||
|
else:
|
||||||
|
await websocket.send_json(
|
||||||
|
{
|
||||||
|
"type": "error",
|
||||||
|
"value": "Invalid access code or you're out of credits. Please try again.",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
openai_api_key = os.environ.get("OPENAI_API_KEY")
|
if params["openAiApiKey"]:
|
||||||
if openai_api_key:
|
openai_api_key = params["openAiApiKey"]
|
||||||
print("Using OpenAI API key from environment variable")
|
print("Using OpenAI API key from client-side settings dialog")
|
||||||
|
else:
|
||||||
|
openai_api_key = os.environ.get("OPENAI_API_KEY")
|
||||||
|
if openai_api_key:
|
||||||
|
print("Using OpenAI API key from environment variable")
|
||||||
|
|
||||||
if not openai_api_key:
|
if not openai_api_key:
|
||||||
print("OpenAI API key not found")
|
print("OpenAI API key not found")
|
||||||
|
|||||||
@ -51,6 +51,7 @@ function App() {
|
|||||||
isImageGenerationEnabled: true,
|
isImageGenerationEnabled: true,
|
||||||
editorTheme: EditorTheme.COBALT,
|
editorTheme: EditorTheme.COBALT,
|
||||||
isTermOfServiceAccepted: false,
|
isTermOfServiceAccepted: false,
|
||||||
|
accessCode: null,
|
||||||
},
|
},
|
||||||
"setting"
|
"setting"
|
||||||
);
|
);
|
||||||
|
|||||||
@ -15,6 +15,7 @@ import { Label } from "./ui/label";
|
|||||||
import { Input } from "./ui/input";
|
import { Input } from "./ui/input";
|
||||||
import { Select, SelectContent, SelectItem, SelectTrigger } from "./ui/select";
|
import { Select, SelectContent, SelectItem, SelectTrigger } from "./ui/select";
|
||||||
import { capitalize } from "../lib/utils";
|
import { capitalize } from "../lib/utils";
|
||||||
|
import { IS_RUNNING_ON_CLOUD } from "../config";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
settings: Settings;
|
settings: Settings;
|
||||||
@ -38,6 +39,31 @@ function SettingsDialog({ settings, setSettings }: Props) {
|
|||||||
<DialogHeader>
|
<DialogHeader>
|
||||||
<DialogTitle className="mb-4">Settings</DialogTitle>
|
<DialogTitle className="mb-4">Settings</DialogTitle>
|
||||||
</DialogHeader>
|
</DialogHeader>
|
||||||
|
|
||||||
|
{/* Access code */}
|
||||||
|
{IS_RUNNING_ON_CLOUD && (
|
||||||
|
<div className="flex flex-col space-y-4 bg-slate-300 p-4 rounded">
|
||||||
|
<Label htmlFor="access-code">
|
||||||
|
<div>Access Code</div>
|
||||||
|
<div className="font-light mt-1 leading-relaxed">
|
||||||
|
Buy an access code.
|
||||||
|
</div>
|
||||||
|
</Label>
|
||||||
|
|
||||||
|
<Input
|
||||||
|
id="access-code"
|
||||||
|
placeholder="Enter your Screenshot to Code access code"
|
||||||
|
value={settings.accessCode || ""}
|
||||||
|
onChange={(e) =>
|
||||||
|
setSettings((s) => ({
|
||||||
|
...s,
|
||||||
|
accessCode: e.target.value,
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
<div className="flex items-center space-x-2">
|
<div className="flex items-center space-x-2">
|
||||||
<Label htmlFor="image-generation">
|
<Label htmlFor="image-generation">
|
||||||
<div>DALL-E Placeholder Image Generation</div>
|
<div>DALL-E Placeholder Image Generation</div>
|
||||||
|
|||||||
@ -25,6 +25,7 @@ export interface Settings {
|
|||||||
isImageGenerationEnabled: boolean;
|
isImageGenerationEnabled: boolean;
|
||||||
editorTheme: EditorTheme;
|
editorTheme: EditorTheme;
|
||||||
isTermOfServiceAccepted: boolean; // Only relevant for hosted version
|
isTermOfServiceAccepted: boolean; // Only relevant for hosted version
|
||||||
|
accessCode: string | null; // Only relevant for hosted version
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum AppState {
|
export enum AppState {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user