@@ -61,18 +61,30 @@ import {
6161 projectRelativePathFromBrowserUrl ,
6262 type BrowserViewportId ,
6363} from './design-browser-tools' ;
64+ import {
65+ DESIGN_BROWSER_HISTORY_LIMIT ,
66+ loadBrowserViewport ,
67+ loadHistory ,
68+ saveBrowserViewport ,
69+ saveHistory ,
70+ type BrowserHistoryEntry ,
71+ } from './design-browser-storage' ;
6472import { Icon } from './Icon' ;
6573import { BoardComposerPopover } from './BoardComposerPopover' ;
6674import { PreviewDrawOverlay } from './PreviewDrawOverlay' ;
6775import { RemixIcon } from './RemixIcon' ;
6876
69- type BrowserHistoryEntry = {
70- iconUrl ?: string ;
71- title : string ;
72- url : string ;
73- lastVisitedAt : number ;
74- visitCount : number ;
75- } ;
77+ export {
78+ removeDesignBrowserProjectCache ,
79+ designBrowserHistoryStorageKey ,
80+ designBrowserViewportStorageKey ,
81+ isHistoryEntry ,
82+ loadBrowserViewport ,
83+ loadHistory ,
84+ saveBrowserViewport ,
85+ saveHistory ,
86+ type BrowserHistoryEntry ,
87+ } from './design-browser-storage' ;
7688
7789type BrowserNavigationEntry = {
7890 title : string ;
@@ -283,7 +295,7 @@ export interface BrowserPageInfo {
283295
284296const EMPTY_URL = 'about:blank' ;
285297const DESIGN_BROWSER_PARTITION = 'persist:open-design-design-browser' ;
286- const HISTORY_LIMIT = 80 ;
298+ const HISTORY_LIMIT = DESIGN_BROWSER_HISTORY_LIMIT ;
287299const HISTORY_SUGGESTION_LIMIT = 20 ;
288300const EMPTY_PREVIEW_COMMENTS : PreviewComment [ ] = [ ] ;
289301// Cap the resource-hint (`dns-prefetch`/`preconnect`) links we leave in <head>.
@@ -3300,73 +3312,6 @@ function BrowserSiteIcon({
33003312 ) ;
33013313}
33023314
3303- export function loadHistory ( projectId : string ) : BrowserHistoryEntry [ ] {
3304- if ( typeof window === 'undefined' ) return [ ] ;
3305- try {
3306- const raw = window . localStorage . getItem ( historyStorageKey ( projectId ) ) ;
3307- const parsed = raw ? JSON . parse ( raw ) : [ ] ;
3308- if ( ! Array . isArray ( parsed ) ) return [ ] ;
3309- return parsed
3310- . filter ( isHistoryEntry )
3311- . sort ( ( left , right ) => right . lastVisitedAt - left . lastVisitedAt )
3312- . slice ( 0 , HISTORY_LIMIT ) ;
3313- } catch {
3314- return [ ] ;
3315- }
3316- }
3317-
3318- export function saveHistory ( projectId : string , history : BrowserHistoryEntry [ ] ) {
3319- if ( typeof window === 'undefined' ) return ;
3320- try {
3321- window . localStorage . setItem ( historyStorageKey ( projectId ) , JSON . stringify ( history . slice ( 0 , HISTORY_LIMIT ) ) ) ;
3322- } catch {
3323- // Ignore storage quota and private-mode failures.
3324- }
3325- }
3326-
3327- function historyStorageKey ( projectId : string ) : string {
3328- return `od:design-browser:${ projectId } :history:v1` ;
3329- }
3330-
3331- function viewportStorageKey ( projectId : string ) : string {
3332- return `od:design-browser:${ projectId } :viewport:v1` ;
3333- }
3334-
3335- function isBrowserViewportId ( value : unknown ) : value is BrowserViewportId {
3336- return value === 'desktop' || value === 'tablet' || value === 'mobile' ;
3337- }
3338-
3339- export function loadBrowserViewport ( projectId : string ) : BrowserViewportId {
3340- if ( typeof window === 'undefined' ) return 'desktop' ;
3341- try {
3342- const stored = window . localStorage . getItem ( viewportStorageKey ( projectId ) ) ;
3343- return isBrowserViewportId ( stored ) ? stored : 'desktop' ;
3344- } catch {
3345- return 'desktop' ;
3346- }
3347- }
3348-
3349- export function saveBrowserViewport ( projectId : string , viewport : BrowserViewportId ) {
3350- if ( typeof window === 'undefined' ) return ;
3351- try {
3352- window . localStorage . setItem ( viewportStorageKey ( projectId ) , viewport ) ;
3353- } catch {
3354- // Ignore storage quota and private-mode failures.
3355- }
3356- }
3357-
3358- export function isHistoryEntry ( value : unknown ) : value is BrowserHistoryEntry {
3359- if ( typeof value !== 'object' || value == null || Array . isArray ( value ) ) return false ;
3360- const record = value as Record < string , unknown > ;
3361- return (
3362- typeof record . url === 'string' &&
3363- typeof record . title === 'string' &&
3364- typeof record . lastVisitedAt === 'number' &&
3365- typeof record . visitCount === 'number' &&
3366- ( record . iconUrl === undefined || typeof record . iconUrl === 'string' )
3367- ) ;
3368- }
3369-
33703315export function normalizeBrowserAddress ( rawAddress : string ) : string {
33713316 const value = rawAddress . trim ( ) ;
33723317 if ( ! value ) return EMPTY_URL ;
0 commit comments