fix:Theme issues

This commit is contained in:
shiva raj badu 2026-03-24 13:08:47 +05:45
parent e48a15fad0
commit f58f2758ed
No known key found for this signature in database
10 changed files with 81 additions and 11 deletions

View file

@ -0,0 +1,31 @@
"""add theme column to presentations
Revision ID: 82abdbc476a7
Revises: f42ad4074449
Create Date: 2026-03-24 12:42:46.220359
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
import sqlmodel
# revision identifiers, used by Alembic.
revision: str = '82abdbc476a7'
down_revision: Union[str, None] = 'f42ad4074449'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View file

@ -0,0 +1,31 @@
"""add theme column to presentations
Revision ID: f42ad4074449
Revises: 00b3c27a13bc
Create Date: 2026-03-24 12:42:32.369006
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
import sqlmodel
# revision identifiers, used by Alembic.
revision: str = 'f42ad4074449'
down_revision: Union[str, None] = '00b3c27a13bc'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('presentations', sa.Column('theme', sa.JSON(), nullable=True))
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('presentations', 'theme')
# ### end Alembic commands ###

View file

@ -366,6 +366,7 @@ async def update_presentation(
id: Annotated[uuid.UUID, Body()],
n_slides: Annotated[Optional[int], Body()] = None,
title: Annotated[Optional[str], Body()] = None,
theme: Annotated[Optional[dict], Body()] = None,
slides: Annotated[Optional[List[SlideModel]], Body()] = None,
sql_session: AsyncSession = Depends(get_async_session),
):
@ -378,10 +379,11 @@ async def update_presentation(
presentation_update_dict["n_slides"] = n_slides
if title:
presentation_update_dict["title"] = title
if theme:
presentation_update_dict["theme"] = theme
if n_slides or title:
if presentation_update_dict:
presentation.sqlmodel_update(presentation_update_dict)
if slides:
# Just to make sure id is UUID
for slide in slides:

View file

@ -1,3 +1,4 @@
import copy
import uuid
from typing import Any, List, Optional
@ -67,7 +68,9 @@ def _read_themes_from_row(row: Optional[KeyValueSqlModel]) -> list[dict[str, Any
return []
value = row.value if isinstance(row.value, dict) else {}
themes = value.get("themes", [])
return themes if isinstance(themes, list) else []
if not isinstance(themes, list):
return []
return copy.deepcopy(themes)
async def _resolve_logo_url(

View file

@ -18,3 +18,4 @@ class PresentationWithSlides(BaseModel):
tone: Optional[str] = None
verbosity: Optional[str] = None
slides: List[SlideModel]
theme: Optional[dict] = None

View file

@ -41,6 +41,7 @@ class PresentationModel(SQLModel, table=True):
include_table_of_contents: bool = Field(sa_column=Column(Boolean), default=False)
include_title_slide: bool = Field(sa_column=Column(Boolean), default=True)
web_search: bool = Field(sa_column=Column(Boolean), default=False)
theme: Optional[dict] = Field(sa_column=Column(JSON), default=None)
def get_new_presentation(self):
return PresentationModel(

Binary file not shown.

View file

@ -108,6 +108,7 @@ const PresentationHeader = ({
if (isStreaming) return;
try {
toast.info("Exporting PPTX...");
setIsExporting(true);
// Save the presentation data before exporting
trackEvent(MixpanelEvent.Header_UpdatePresentationContent_API_Call);
@ -146,6 +147,7 @@ const PresentationHeader = ({
if (isStreaming) return;
try {
toast.info("Exporting PDF...");
setIsExporting(true);
// Save the presentation data before exporting
trackEvent(MixpanelEvent.Header_UpdatePresentationContent_API_Call);
@ -250,7 +252,7 @@ const PresentationHeader = ({
{isPresentationSaving && <div className="flex items-center gap-2">
<Loader2 className="w-3.5 h-3.5 animate-spin" />
</div>}
<ThemeSelector presentation_id={presentation_id} current_theme={presentationData?.theme || {}} themes={themes} />
<ThemeSelector current_theme={presentationData?.theme || {}} themes={themes} />
<div className="flex items-center gap-2 bg-[#F6F6F9] px-3.5 h-[38px] border border-[#EDECEC] rounded-[80px]">

View file

@ -3,12 +3,11 @@ import React, { useState } from 'react'
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
import { Palette } from 'lucide-react';
import { useDispatch, useSelector } from 'react-redux';
import { useDispatch } from 'react-redux';
import { updateTheme } from '@/store/slices/presentationGeneration';
import { useRouter } from 'next/navigation';
import { useFontLoader } from '../../hooks/useFontLoad';
import { RootState } from '@/store/store';
const ThemeSelector = ({ presentation_id, current_theme, themes: allThemes }: { presentation_id: string, current_theme: any, themes: any[] }) => {
const ThemeSelector = ({ current_theme, themes: allThemes }: { current_theme: any, themes: any[] }) => {
const [currentTheme, setCurrentTheme] = useState<any>(current_theme)
const dispatch = useDispatch()
const [isOpen, setIsOpen] = useState(false)

View file

@ -25,10 +25,10 @@ export interface DeplotResponse {
}
export interface ImageAssetResponse {
message: string;
path: string;
id: string;
file_url?: string;
message: string;
path: string;
id: string;
file_url?: string;
}