Merge pull request #195 from sambecker/app-refactor
Move `/app` directory to root
This commit is contained in:
commit
cac2a70c35
@ -2,7 +2,7 @@ import {
|
|||||||
getGitHubMeta,
|
getGitHubMeta,
|
||||||
getGitHubPublicFork,
|
getGitHubPublicFork,
|
||||||
} from '@/platforms/github';
|
} from '@/platforms/github';
|
||||||
import { TEMPLATE_REPO_OWNER, TEMPLATE_REPO_NAME } from '@/app-core/config';
|
import { TEMPLATE_REPO_OWNER, TEMPLATE_REPO_NAME } from '@/app/config';
|
||||||
|
|
||||||
describe('GitHub', () => {
|
describe('GitHub', () => {
|
||||||
it('fetches base repo meta', async () => {
|
it('fetches base repo meta', async () => {
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import {
|
|||||||
isPathProtected,
|
isPathProtected,
|
||||||
isPathTag,
|
isPathTag,
|
||||||
isPathTagPhoto,
|
isPathTagPhoto,
|
||||||
} from '@/app-core/paths';
|
} from '@/app/paths';
|
||||||
import { TAG_HIDDEN } from '@/tag';
|
import { TAG_HIDDEN } from '@/tag';
|
||||||
|
|
||||||
const PHOTO_ID = 'UsKSGcbt';
|
const PHOTO_ID = 'UsKSGcbt';
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { getPhotos } from '@/photo/db/query';
|
import { getPhotos } from '@/photo/db/query';
|
||||||
import { OUTDATED_THRESHOLD } from '@/photo';
|
import { OUTDATED_THRESHOLD } from '@/photo';
|
||||||
import AdminOutdatedClient from '@/admin/AdminOutdatedClient';
|
import AdminOutdatedClient from '@/admin/AdminOutdatedClient';
|
||||||
import { AI_TEXT_GENERATION_ENABLED } from '@/app-core/config';
|
import { AI_TEXT_GENERATION_ENABLED } from '@/app/config';
|
||||||
|
|
||||||
export const maxDuration = 60;
|
export const maxDuration = 60;
|
||||||
|
|
||||||
@ -1,12 +1,12 @@
|
|||||||
import { redirect } from 'next/navigation';
|
import { redirect } from 'next/navigation';
|
||||||
import { getPhotoNoStore, getUniqueTagsCached } from '@/photo/cache';
|
import { getPhotoNoStore, getUniqueTagsCached } from '@/photo/cache';
|
||||||
import { PATH_ADMIN } from '@/app-core/paths';
|
import { PATH_ADMIN } from '@/app/paths';
|
||||||
import PhotoEditPageClient from '@/photo/PhotoEditPageClient';
|
import PhotoEditPageClient from '@/photo/PhotoEditPageClient';
|
||||||
import {
|
import {
|
||||||
AI_TEXT_GENERATION_ENABLED,
|
AI_TEXT_GENERATION_ENABLED,
|
||||||
BLUR_ENABLED,
|
BLUR_ENABLED,
|
||||||
IS_PREVIEW,
|
IS_PREVIEW,
|
||||||
} from '@/app-core/config';
|
} from '@/app/config';
|
||||||
import { blurImageFromUrl, resizeImageFromUrl } from '@/photo/server';
|
import { blurImageFromUrl, resizeImageFromUrl } from '@/photo/server';
|
||||||
import { getNextImageUrlForManipulation } from '@/platforms/next-image';
|
import { getNextImageUrlForManipulation } from '@/platforms/next-image';
|
||||||
|
|
||||||
@ -2,7 +2,7 @@ import AdminChildPage from '@/components/AdminChildPage';
|
|||||||
import { redirect } from 'next/navigation';
|
import { redirect } from 'next/navigation';
|
||||||
import { getPhotosCached } from '@/photo/cache';
|
import { getPhotosCached } from '@/photo/cache';
|
||||||
import TagForm from '@/tag/TagForm';
|
import TagForm from '@/tag/TagForm';
|
||||||
import { PATH_ADMIN, PATH_ADMIN_TAGS, pathForTag } from '@/app-core/paths';
|
import { PATH_ADMIN, PATH_ADMIN_TAGS, pathForTag } from '@/app/paths';
|
||||||
import PhotoLightbox from '@/photo/PhotoLightbox';
|
import PhotoLightbox from '@/photo/PhotoLightbox';
|
||||||
import { getPhotosMeta } from '@/photo/db/query';
|
import { getPhotosMeta } from '@/photo/db/query';
|
||||||
import AdminTagBadge from '@/admin/AdminTagBadge';
|
import AdminTagBadge from '@/admin/AdminTagBadge';
|
||||||
@ -1,4 +1,4 @@
|
|||||||
import { PATH_ADMIN } from '@/app-core/paths';
|
import { PATH_ADMIN } from '@/app/paths';
|
||||||
import { extractImageDataFromBlobPath } from '@/photo/server';
|
import { extractImageDataFromBlobPath } from '@/photo/server';
|
||||||
import { redirect } from 'next/navigation';
|
import { redirect } from 'next/navigation';
|
||||||
import { getUniqueTagsCached } from '@/photo/cache';
|
import { getUniqueTagsCached } from '@/photo/cache';
|
||||||
@ -7,7 +7,7 @@ import {
|
|||||||
AI_TEXT_AUTO_GENERATED_FIELDS,
|
AI_TEXT_AUTO_GENERATED_FIELDS,
|
||||||
AI_TEXT_GENERATION_ENABLED,
|
AI_TEXT_GENERATION_ENABLED,
|
||||||
BLUR_ENABLED,
|
BLUR_ENABLED,
|
||||||
} from '@/app-core/config';
|
} from '@/app/config';
|
||||||
import ErrorNote from '@/components/ErrorNote';
|
import ErrorNote from '@/components/ErrorNote';
|
||||||
|
|
||||||
export const maxDuration = 60;
|
export const maxDuration = 60;
|
||||||
@ -1,10 +1,10 @@
|
|||||||
import { getPhotosCached } from '@/photo/cache';
|
import { getPhotosCached } from '@/photo/cache';
|
||||||
import { API_PHOTO_REQUEST_LIMIT, formatPhotoForApi } from '@/app-core/api';
|
import { API_PHOTO_REQUEST_LIMIT, formatPhotoForApi } from '@/app/api';
|
||||||
import {
|
import {
|
||||||
BASE_URL,
|
BASE_URL,
|
||||||
PUBLIC_API_ENABLED,
|
PUBLIC_API_ENABLED,
|
||||||
SITE_TITLE,
|
SITE_TITLE,
|
||||||
} from '@/app-core/config';
|
} from '@/app/config';
|
||||||
|
|
||||||
export const dynamic = 'force-dynamic';
|
export const dynamic = 'force-dynamic';
|
||||||
|
|
||||||
@ -7,7 +7,7 @@ import {
|
|||||||
cloudflareR2Client,
|
cloudflareR2Client,
|
||||||
cloudflareR2PutObjectCommandForKey,
|
cloudflareR2PutObjectCommandForKey,
|
||||||
} from '@/platforms/storage/cloudflare-r2';
|
} from '@/platforms/storage/cloudflare-r2';
|
||||||
import { CURRENT_STORAGE } from '@/app-core/config';
|
import { CURRENT_STORAGE } from '@/app/config';
|
||||||
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
|
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
|
||||||
|
|
||||||
export async function GET(
|
export async function GET(
|
||||||
@ -9,7 +9,7 @@ import {
|
|||||||
PATH_ROOT,
|
PATH_ROOT,
|
||||||
absolutePathForPhoto,
|
absolutePathForPhoto,
|
||||||
absolutePathForPhotoImage,
|
absolutePathForPhotoImage,
|
||||||
} from '@/app-core/paths';
|
} from '@/app/paths';
|
||||||
import PhotoDetailPage from '@/photo/PhotoDetailPage';
|
import PhotoDetailPage from '@/photo/PhotoDetailPage';
|
||||||
import { FilmSimulation } from '@/simulation';
|
import { FilmSimulation } from '@/simulation';
|
||||||
import {
|
import {
|
||||||
@ -6,7 +6,7 @@ import {
|
|||||||
import FilmSimulationImageResponse from
|
import FilmSimulationImageResponse from
|
||||||
'@/image-response/FilmSimulationImageResponse';
|
'@/image-response/FilmSimulationImageResponse';
|
||||||
import { FilmSimulation } from '@/simulation';
|
import { FilmSimulation } from '@/simulation';
|
||||||
import { getIBMPlexMonoMedium } from '@/app-core/font';
|
import { getIBMPlexMonoMedium } from '@/app/font';
|
||||||
import { ImageResponse } from 'next/og';
|
import { ImageResponse } from 'next/og';
|
||||||
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
||||||
import { GENERATE_STATIC_PARAMS_LIMIT } from '@/photo/db';
|
import { GENERATE_STATIC_PARAMS_LIMIT } from '@/photo/db';
|
||||||
@ -14,7 +14,7 @@ import { getUniqueFilmSimulations } from '@/photo/db/query';
|
|||||||
import {
|
import {
|
||||||
STATICALLY_OPTIMIZED_PHOTO_CATEGORY_OG_IMAGES,
|
STATICALLY_OPTIMIZED_PHOTO_CATEGORY_OG_IMAGES,
|
||||||
IS_PRODUCTION,
|
IS_PRODUCTION,
|
||||||
} from '@/app-core/config';
|
} from '@/app/config';
|
||||||
|
|
||||||
export let generateStaticParams:
|
export let generateStaticParams:
|
||||||
(() => Promise<{ simulation: FilmSimulation }[]>) | undefined = undefined;
|
(() => Promise<{ simulation: FilmSimulation }[]>) | undefined = undefined;
|
||||||
@ -2,9 +2,9 @@ import { INFINITE_SCROLL_GRID_INITIAL } from '@/photo';
|
|||||||
import { getUniqueFilmSimulations } from '@/photo/db/query';
|
import { getUniqueFilmSimulations } from '@/photo/db/query';
|
||||||
import { FilmSimulation, generateMetaForFilmSimulation } from '@/simulation';
|
import { FilmSimulation, generateMetaForFilmSimulation } from '@/simulation';
|
||||||
import FilmSimulationOverview from '@/simulation/FilmSimulationOverview';
|
import FilmSimulationOverview from '@/simulation/FilmSimulationOverview';
|
||||||
import { IS_PRODUCTION } from '@/app-core/config';
|
import { IS_PRODUCTION } from '@/app/config';
|
||||||
import { getPhotosFilmSimulationDataCached } from '@/simulation/data';
|
import { getPhotosFilmSimulationDataCached } from '@/simulation/data';
|
||||||
import { STATICALLY_OPTIMIZED_PHOTO_CATEGORIES } from '@/app-core/config';
|
import { STATICALLY_OPTIMIZED_PHOTO_CATEGORIES } from '@/app/config';
|
||||||
import { Metadata } from 'next/types';
|
import { Metadata } from 'next/types';
|
||||||
import { cache } from 'react';
|
import { cache } from 'react';
|
||||||
|
|
||||||
@ -9,7 +9,7 @@ import {
|
|||||||
PATH_ROOT,
|
PATH_ROOT,
|
||||||
absolutePathForPhoto,
|
absolutePathForPhoto,
|
||||||
absolutePathForPhotoImage,
|
absolutePathForPhotoImage,
|
||||||
} from '@/app-core/paths';
|
} from '@/app/paths';
|
||||||
import PhotoDetailPage from '@/photo/PhotoDetailPage';
|
import PhotoDetailPage from '@/photo/PhotoDetailPage';
|
||||||
import { getPhotosNearIdCached } from '@/photo/cache';
|
import { getPhotosNearIdCached } from '@/photo/cache';
|
||||||
import { cache } from 'react';
|
import { cache } from 'react';
|
||||||
@ -3,7 +3,7 @@ import {
|
|||||||
IMAGE_OG_DIMENSION_SMALL,
|
IMAGE_OG_DIMENSION_SMALL,
|
||||||
MAX_PHOTOS_TO_SHOW_PER_TAG,
|
MAX_PHOTOS_TO_SHOW_PER_TAG,
|
||||||
} from '@/image-response';
|
} from '@/image-response';
|
||||||
import { getIBMPlexMonoMedium } from '@/app-core/font';
|
import { getIBMPlexMonoMedium } from '@/app/font';
|
||||||
import { ImageResponse } from 'next/og';
|
import { ImageResponse } from 'next/og';
|
||||||
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
||||||
import FocalLengthImageResponse from
|
import FocalLengthImageResponse from
|
||||||
@ -14,7 +14,7 @@ import { getUniqueFocalLengths } from '@/photo/db/query';
|
|||||||
import {
|
import {
|
||||||
STATICALLY_OPTIMIZED_PHOTO_CATEGORY_OG_IMAGES,
|
STATICALLY_OPTIMIZED_PHOTO_CATEGORY_OG_IMAGES,
|
||||||
IS_PRODUCTION,
|
IS_PRODUCTION,
|
||||||
} from '@/app-core/config';
|
} from '@/app/config';
|
||||||
|
|
||||||
export let generateStaticParams:
|
export let generateStaticParams:
|
||||||
(() => Promise<{ focal: string }[]>) | undefined = undefined;
|
(() => Promise<{ focal: string }[]>) | undefined = undefined;
|
||||||
@ -2,10 +2,10 @@ import { generateMetaForFocalLength, getFocalLengthFromString } from '@/focal';
|
|||||||
import FocalLengthOverview from '@/focal/FocalLengthOverview';
|
import FocalLengthOverview from '@/focal/FocalLengthOverview';
|
||||||
import { getPhotosFocalLengthDataCached } from '@/focal/data';
|
import { getPhotosFocalLengthDataCached } from '@/focal/data';
|
||||||
import { INFINITE_SCROLL_GRID_INITIAL } from '@/photo';
|
import { INFINITE_SCROLL_GRID_INITIAL } from '@/photo';
|
||||||
import { IS_PRODUCTION } from '@/app-core/config';
|
import { IS_PRODUCTION } from '@/app/config';
|
||||||
import { getUniqueFocalLengths } from '@/photo/db/query';
|
import { getUniqueFocalLengths } from '@/photo/db/query';
|
||||||
import { STATICALLY_OPTIMIZED_PHOTO_CATEGORIES } from '@/app-core/config';
|
import { STATICALLY_OPTIMIZED_PHOTO_CATEGORIES } from '@/app/config';
|
||||||
import { PATH_ROOT } from '@/app-core/paths';
|
import { PATH_ROOT } from '@/app/paths';
|
||||||
import type { Metadata } from 'next';
|
import type { Metadata } from 'next';
|
||||||
import { redirect } from 'next/navigation';
|
import { redirect } from 'next/navigation';
|
||||||
import { cache } from 'react';
|
import { cache } from 'react';
|
||||||
@ -4,7 +4,7 @@ import {
|
|||||||
MAX_PHOTOS_TO_SHOW_OG,
|
MAX_PHOTOS_TO_SHOW_OG,
|
||||||
} from '@/image-response';
|
} from '@/image-response';
|
||||||
import HomeImageResponse from '@/image-response/HomeImageResponse';
|
import HomeImageResponse from '@/image-response/HomeImageResponse';
|
||||||
import { getIBMPlexMonoMedium } from '@/app-core/font';
|
import { getIBMPlexMonoMedium } from '@/app/font';
|
||||||
import { ImageResponse } from 'next/og';
|
import { ImageResponse } from 'next/og';
|
||||||
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
||||||
import { isNextImageReadyBasedOnPhotos } from '@/photo';
|
import { isNextImageReadyBasedOnPhotos } from '@/photo';
|
||||||
@ -7,20 +7,20 @@ import {
|
|||||||
SITE_DESCRIPTION,
|
SITE_DESCRIPTION,
|
||||||
SITE_DOMAIN_OR_TITLE,
|
SITE_DOMAIN_OR_TITLE,
|
||||||
SITE_TITLE,
|
SITE_TITLE,
|
||||||
} from '@/app-core/config';
|
} from '@/app/config';
|
||||||
import AppStateProvider from '@/state/AppStateProvider';
|
import AppStateProvider from '@/state/AppStateProvider';
|
||||||
import ToasterWithThemes from '@/toast/ToasterWithThemes';
|
import ToasterWithThemes from '@/toast/ToasterWithThemes';
|
||||||
import PhotoEscapeHandler from '@/photo/PhotoEscapeHandler';
|
import PhotoEscapeHandler from '@/photo/PhotoEscapeHandler';
|
||||||
import { Metadata } from 'next/types';
|
import { Metadata } from 'next/types';
|
||||||
import { ThemeProvider } from 'next-themes';
|
import { ThemeProvider } from 'next-themes';
|
||||||
import Nav from '@/app-core/Nav';
|
import Nav from '@/app/Nav';
|
||||||
import Footer from '@/app-core/Footer';
|
import Footer from '@/app/Footer';
|
||||||
import CommandK from '@/app-core/CommandK';
|
import CommandK from '@/app/CommandK';
|
||||||
import SwrConfigClient from '../state/SwrConfigClient';
|
import SwrConfigClient from '@/state/SwrConfigClient';
|
||||||
import AdminBatchEditPanel from '@/admin/AdminBatchEditPanel';
|
import AdminBatchEditPanel from '@/admin/AdminBatchEditPanel';
|
||||||
import ShareModals from '@/share/ShareModals';
|
import ShareModals from '@/share/ShareModals';
|
||||||
|
|
||||||
import '../../tailwind.css';
|
import '../tailwind.css';
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: SITE_TITLE,
|
title: SITE_TITLE,
|
||||||
@ -1,13 +1,13 @@
|
|||||||
import { getPhotoCached } from '@/photo/cache';
|
import { getPhotoCached } from '@/photo/cache';
|
||||||
import { IMAGE_OG_DIMENSION } from '@/image-response';
|
import { IMAGE_OG_DIMENSION } from '@/image-response';
|
||||||
import PhotoImageResponse from '@/image-response/PhotoImageResponse';
|
import PhotoImageResponse from '@/image-response/PhotoImageResponse';
|
||||||
import { getIBMPlexMonoMedium } from '@/app-core/font';
|
import { getIBMPlexMonoMedium } from '@/app/font';
|
||||||
import { ImageResponse } from 'next/og';
|
import { ImageResponse } from 'next/og';
|
||||||
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
||||||
import {
|
import {
|
||||||
IS_PRODUCTION,
|
IS_PRODUCTION,
|
||||||
STATICALLY_OPTIMIZED_PHOTO_OG_IMAGES,
|
STATICALLY_OPTIMIZED_PHOTO_OG_IMAGES,
|
||||||
} from '@/app-core/config';
|
} from '@/app/config';
|
||||||
import { getPhotoIds } from '@/photo/db/query';
|
import { getPhotoIds } from '@/photo/db/query';
|
||||||
import { GENERATE_STATIC_PARAMS_LIMIT } from '@/photo/db';
|
import { GENERATE_STATIC_PARAMS_LIMIT } from '@/photo/db';
|
||||||
import { isNextImageReadyBasedOnPhotos } from '@/photo';
|
import { isNextImageReadyBasedOnPhotos } from '@/photo';
|
||||||
@ -9,10 +9,10 @@ import {
|
|||||||
PATH_ROOT,
|
PATH_ROOT,
|
||||||
absolutePathForPhoto,
|
absolutePathForPhoto,
|
||||||
absolutePathForPhotoImage,
|
absolutePathForPhotoImage,
|
||||||
} from '@/app-core/paths';
|
} from '@/app/paths';
|
||||||
import PhotoDetailPage from '@/photo/PhotoDetailPage';
|
import PhotoDetailPage from '@/photo/PhotoDetailPage';
|
||||||
import { getPhotosNearIdCached } from '@/photo/cache';
|
import { getPhotosNearIdCached } from '@/photo/cache';
|
||||||
import { IS_PRODUCTION, STATICALLY_OPTIMIZED_PHOTOS } from '@/app-core/config';
|
import { IS_PRODUCTION, STATICALLY_OPTIMIZED_PHOTOS } from '@/app/config';
|
||||||
import { getPhotoIds } from '@/photo/db/query';
|
import { getPhotoIds } from '@/photo/db/query';
|
||||||
import { GENERATE_STATIC_PARAMS_LIMIT } from '@/photo/db';
|
import { GENERATE_STATIC_PARAMS_LIMIT } from '@/photo/db';
|
||||||
import { cache } from 'react';
|
import { cache } from 'react';
|
||||||
@ -7,7 +7,7 @@ import PhotosEmptyState from '@/photo/PhotosEmptyState';
|
|||||||
import { Metadata } from 'next/types';
|
import { Metadata } from 'next/types';
|
||||||
import { cache } from 'react';
|
import { cache } from 'react';
|
||||||
import { getPhotos, getPhotosMeta } from '@/photo/db/query';
|
import { getPhotos, getPhotosMeta } from '@/photo/db/query';
|
||||||
import { GRID_HOMEPAGE_ENABLED } from '@/app-core/config';
|
import { GRID_HOMEPAGE_ENABLED } from '@/app/config';
|
||||||
import { getPhotoSidebarData } from '@/photo/data';
|
import { getPhotoSidebarData } from '@/photo/data';
|
||||||
import PhotoGridPage from '@/photo/PhotoGridPage';
|
import PhotoGridPage from '@/photo/PhotoGridPage';
|
||||||
import PhotoFeedPage from '@/photo/PhotoFeedPage';
|
import PhotoFeedPage from '@/photo/PhotoFeedPage';
|
||||||
@ -9,7 +9,7 @@ import {
|
|||||||
PATH_ROOT,
|
PATH_ROOT,
|
||||||
absolutePathForPhoto,
|
absolutePathForPhoto,
|
||||||
absolutePathForPhotoImage,
|
absolutePathForPhotoImage,
|
||||||
} from '@/app-core/paths';
|
} from '@/app/paths';
|
||||||
import PhotoDetailPage from '@/photo/PhotoDetailPage';
|
import PhotoDetailPage from '@/photo/PhotoDetailPage';
|
||||||
import {
|
import {
|
||||||
getPhotosMetaCached,
|
getPhotosMetaCached,
|
||||||
@ -5,7 +5,7 @@ import {
|
|||||||
MAX_PHOTOS_TO_SHOW_PER_TAG,
|
MAX_PHOTOS_TO_SHOW_PER_TAG,
|
||||||
} from '@/image-response';
|
} from '@/image-response';
|
||||||
import CameraImageResponse from '@/image-response/CameraImageResponse';
|
import CameraImageResponse from '@/image-response/CameraImageResponse';
|
||||||
import { getIBMPlexMonoMedium } from '@/app-core/font';
|
import { getIBMPlexMonoMedium } from '@/app/font';
|
||||||
import { ImageResponse } from 'next/og';
|
import { ImageResponse } from 'next/og';
|
||||||
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
||||||
import { GENERATE_STATIC_PARAMS_LIMIT } from '@/photo/db';
|
import { GENERATE_STATIC_PARAMS_LIMIT } from '@/photo/db';
|
||||||
@ -13,7 +13,7 @@ import { getUniqueCameras } from '@/photo/db/query';
|
|||||||
import {
|
import {
|
||||||
STATICALLY_OPTIMIZED_PHOTO_CATEGORY_OG_IMAGES,
|
STATICALLY_OPTIMIZED_PHOTO_CATEGORY_OG_IMAGES,
|
||||||
IS_PRODUCTION,
|
IS_PRODUCTION,
|
||||||
} from '@/app-core/config';
|
} from '@/app/config';
|
||||||
|
|
||||||
export let generateStaticParams:
|
export let generateStaticParams:
|
||||||
(() => Promise<{ camera: Camera }[]>) | undefined = undefined;
|
(() => Promise<{ camera: Camera }[]>) | undefined = undefined;
|
||||||
@ -5,8 +5,8 @@ import { INFINITE_SCROLL_GRID_INITIAL } from '@/photo';
|
|||||||
import { getPhotosCameraDataCached } from '@/camera/data';
|
import { getPhotosCameraDataCached } from '@/camera/data';
|
||||||
import CameraOverview from '@/camera/CameraOverview';
|
import CameraOverview from '@/camera/CameraOverview';
|
||||||
import { cache } from 'react';
|
import { cache } from 'react';
|
||||||
import { STATICALLY_OPTIMIZED_PHOTO_CATEGORIES } from '@/app-core/config';
|
import { STATICALLY_OPTIMIZED_PHOTO_CATEGORIES } from '@/app/config';
|
||||||
import { IS_PRODUCTION } from '@/app-core/config';
|
import { IS_PRODUCTION } from '@/app/config';
|
||||||
import { getUniqueCameras } from '@/photo/db/query';
|
import { getUniqueCameras } from '@/photo/db/query';
|
||||||
|
|
||||||
const getPhotosCameraDataCachedCached = cache((
|
const getPhotosCameraDataCachedCached = cache((
|
||||||
@ -1,6 +1,6 @@
|
|||||||
import { auth } from '@/auth';
|
import { auth } from '@/auth';
|
||||||
import SignInForm from '@/auth/SignInForm';
|
import SignInForm from '@/auth/SignInForm';
|
||||||
import { PATH_ADMIN } from '@/app-core/paths';
|
import { PATH_ADMIN } from '@/app/paths';
|
||||||
import { clsx } from 'clsx/lite';
|
import { clsx } from 'clsx/lite';
|
||||||
import { redirect } from 'next/navigation';
|
import { redirect } from 'next/navigation';
|
||||||
|
|
||||||
@ -9,7 +9,7 @@ import {
|
|||||||
PATH_ROOT,
|
PATH_ROOT,
|
||||||
absolutePathForPhoto,
|
absolutePathForPhoto,
|
||||||
absolutePathForPhotoImage,
|
absolutePathForPhotoImage,
|
||||||
} from '@/app-core/paths';
|
} from '@/app/paths';
|
||||||
import PhotoDetailPage from '@/photo/PhotoDetailPage';
|
import PhotoDetailPage from '@/photo/PhotoDetailPage';
|
||||||
import { getPhotosNearIdCached } from '@/photo/cache';
|
import { getPhotosNearIdCached } from '@/photo/cache';
|
||||||
import { cache } from 'react';
|
import { cache } from 'react';
|
||||||
@ -4,7 +4,7 @@ import {
|
|||||||
MAX_PHOTOS_TO_SHOW_PER_TAG,
|
MAX_PHOTOS_TO_SHOW_PER_TAG,
|
||||||
} from '@/image-response';
|
} from '@/image-response';
|
||||||
import TagImageResponse from '@/image-response/TagImageResponse';
|
import TagImageResponse from '@/image-response/TagImageResponse';
|
||||||
import { getIBMPlexMonoMedium } from '@/app-core/font';
|
import { getIBMPlexMonoMedium } from '@/app/font';
|
||||||
import { ImageResponse } from 'next/og';
|
import { ImageResponse } from 'next/og';
|
||||||
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
||||||
import { GENERATE_STATIC_PARAMS_LIMIT } from '@/photo/db';
|
import { GENERATE_STATIC_PARAMS_LIMIT } from '@/photo/db';
|
||||||
@ -12,7 +12,7 @@ import { getUniqueTags } from '@/photo/db/query';
|
|||||||
import {
|
import {
|
||||||
STATICALLY_OPTIMIZED_PHOTO_CATEGORY_OG_IMAGES,
|
STATICALLY_OPTIMIZED_PHOTO_CATEGORY_OG_IMAGES,
|
||||||
IS_PRODUCTION,
|
IS_PRODUCTION,
|
||||||
} from '@/app-core/config';
|
} from '@/app/config';
|
||||||
|
|
||||||
export let generateStaticParams:
|
export let generateStaticParams:
|
||||||
(() => Promise<{ tag: string }[]>) | undefined = undefined;
|
(() => Promise<{ tag: string }[]>) | undefined = undefined;
|
||||||
@ -1,8 +1,8 @@
|
|||||||
import { INFINITE_SCROLL_GRID_INITIAL } from '@/photo';
|
import { INFINITE_SCROLL_GRID_INITIAL } from '@/photo';
|
||||||
import { getUniqueTags } from '@/photo/db/query';
|
import { getUniqueTags } from '@/photo/db/query';
|
||||||
import { IS_PRODUCTION } from '@/app-core/config';
|
import { IS_PRODUCTION } from '@/app/config';
|
||||||
import { STATICALLY_OPTIMIZED_PHOTO_CATEGORIES } from '@/app-core/config';
|
import { STATICALLY_OPTIMIZED_PHOTO_CATEGORIES } from '@/app/config';
|
||||||
import { PATH_ROOT } from '@/app-core/paths';
|
import { PATH_ROOT } from '@/app/paths';
|
||||||
import { generateMetaForTag } from '@/tag';
|
import { generateMetaForTag } from '@/tag';
|
||||||
import TagOverview from '@/tag/TagOverview';
|
import TagOverview from '@/tag/TagOverview';
|
||||||
import { getPhotosTagDataCached } from '@/tag/data';
|
import { getPhotosTagDataCached } from '@/tag/data';
|
||||||
@ -8,7 +8,7 @@ import {
|
|||||||
getPhotosNearIdCached,
|
getPhotosNearIdCached,
|
||||||
} from '@/photo/cache';
|
} from '@/photo/cache';
|
||||||
import { getPhotosMeta } from '@/photo/db/query';
|
import { getPhotosMeta } from '@/photo/db/query';
|
||||||
import { PATH_ROOT, absolutePathForPhoto } from '@/app-core/paths';
|
import { PATH_ROOT, absolutePathForPhoto } from '@/app/paths';
|
||||||
import { TAG_HIDDEN } from '@/tag';
|
import { TAG_HIDDEN } from '@/tag';
|
||||||
import { Metadata } from 'next';
|
import { Metadata } from 'next';
|
||||||
import { redirect } from 'next/navigation';
|
import { redirect } from 'next/navigation';
|
||||||
@ -4,7 +4,7 @@ import SiteGrid from '@/components/SiteGrid';
|
|||||||
import PhotoGrid from '@/photo/PhotoGrid';
|
import PhotoGrid from '@/photo/PhotoGrid';
|
||||||
import { getPhotosNoStore } from '@/photo/cache';
|
import { getPhotosNoStore } from '@/photo/cache';
|
||||||
import { getPhotosMeta } from '@/photo/db/query';
|
import { getPhotosMeta } from '@/photo/db/query';
|
||||||
import { absolutePathForTag } from '@/app-core/paths';
|
import { absolutePathForTag } from '@/app/paths';
|
||||||
import { TAG_HIDDEN, descriptionForTaggedPhotos, titleForTag } from '@/tag';
|
import { TAG_HIDDEN, descriptionForTaggedPhotos, titleForTag } from '@/tag';
|
||||||
import HiddenHeader from '@/tag/HiddenHeader';
|
import HiddenHeader from '@/tag/HiddenHeader';
|
||||||
import { Metadata } from 'next';
|
import { Metadata } from 'next';
|
||||||
@ -5,7 +5,7 @@ import {
|
|||||||
} from '@/image-response';
|
} from '@/image-response';
|
||||||
import TemplateImageResponse from
|
import TemplateImageResponse from
|
||||||
'@/image-response/TemplateImageResponse';
|
'@/image-response/TemplateImageResponse';
|
||||||
import { getIBMPlexMonoMedium } from '@/app-core/font';
|
import { getIBMPlexMonoMedium } from '@/app/font';
|
||||||
import { ImageResponse } from 'next/og';
|
import { ImageResponse } from 'next/og';
|
||||||
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
||||||
import { isNextImageReadyBasedOnPhotos } from '@/photo';
|
import { isNextImageReadyBasedOnPhotos } from '@/photo';
|
||||||
@ -5,7 +5,7 @@ import {
|
|||||||
} from '@/image-response';
|
} from '@/image-response';
|
||||||
import TemplateImageResponse from
|
import TemplateImageResponse from
|
||||||
'@/image-response/TemplateImageResponse';
|
'@/image-response/TemplateImageResponse';
|
||||||
import { getIBMPlexMonoMedium } from '@/app-core/font';
|
import { getIBMPlexMonoMedium } from '@/app/font';
|
||||||
import { ImageResponse } from 'next/og';
|
import { ImageResponse } from 'next/og';
|
||||||
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
|
||||||
import { isNextImageReadyBasedOnPhotos } from '@/photo';
|
import { isNextImageReadyBasedOnPhotos } from '@/photo';
|
||||||
@ -4,7 +4,7 @@ import {
|
|||||||
TEMPLATE_REPO_NAME,
|
TEMPLATE_REPO_NAME,
|
||||||
TEMPLATE_DESCRIPTION,
|
TEMPLATE_DESCRIPTION,
|
||||||
TEMPLATE_TITLE,
|
TEMPLATE_TITLE,
|
||||||
} from '@/app-core/config';
|
} from '@/app/config';
|
||||||
import { NextResponse } from 'next/server';
|
import { NextResponse } from 'next/server';
|
||||||
|
|
||||||
const REQUIRE_ENV_VARS = false;
|
const REQUIRE_ENV_VARS = false;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
import { auth } from './auth';
|
import { auth } from './src/auth';
|
||||||
import { NextRequest, NextResponse } from 'next/server';
|
import { NextRequest, NextResponse } from 'next/server';
|
||||||
import type { NextApiRequest, NextApiResponse } from 'next';
|
import type { NextApiRequest, NextApiResponse } from 'next';
|
||||||
import {
|
import {
|
||||||
@ -8,7 +8,7 @@ import {
|
|||||||
PATH_OG_SAMPLE,
|
PATH_OG_SAMPLE,
|
||||||
PREFIX_PHOTO,
|
PREFIX_PHOTO,
|
||||||
PREFIX_TAG,
|
PREFIX_TAG,
|
||||||
} from './app-core/paths';
|
} from './src/app/paths';
|
||||||
|
|
||||||
export default function middleware(req: NextRequest, res:NextResponse) {
|
export default function middleware(req: NextRequest, res:NextResponse) {
|
||||||
const pathname = req.nextUrl.pathname;
|
const pathname = req.nextUrl.pathname;
|
||||||
@ -46,7 +46,12 @@ export const config = {
|
|||||||
// - /_next/image*
|
// - /_next/image*
|
||||||
// - /favicon.ico + /favicons/*
|
// - /favicon.ico + /favicons/*
|
||||||
// - /grid
|
// - /grid
|
||||||
|
// - /feed
|
||||||
// - / (root)
|
// - / (root)
|
||||||
|
// - /home-image
|
||||||
|
// - /template-image
|
||||||
|
// - /template-image-tight
|
||||||
|
// - /template-url
|
||||||
// eslint-disable-next-line max-len
|
// eslint-disable-next-line max-len
|
||||||
matcher: ['/((?!api$|api/auth|_next/static|_next/image|favicon.ico$|favicons/|grid$|$).*)'],
|
matcher: ['/((?!api$|api/auth|_next/static|_next/image|favicon.ico$|favicons/|grid$|feed$|home-image$|template-image$|template-image-tight$|template-url$|$).*)'],
|
||||||
};
|
};
|
||||||
31
package.json
31
package.json
@ -9,9 +9,9 @@
|
|||||||
"analyze": "ANALYZE=true next build"
|
"analyze": "ANALYZE=true next build"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ai-sdk/openai": "^1.1.9",
|
"@ai-sdk/openai": "^1.1.12",
|
||||||
"@aws-sdk/client-s3": "3.744.0",
|
"@aws-sdk/client-s3": "3.750.0",
|
||||||
"@aws-sdk/s3-request-presigner": "3.744.0",
|
"@aws-sdk/s3-request-presigner": "3.750.0",
|
||||||
"@radix-ui/react-dialog": "^1.1.6",
|
"@radix-ui/react-dialog": "^1.1.6",
|
||||||
"@radix-ui/react-dropdown-menu": "^2.1.6",
|
"@radix-ui/react-dropdown-menu": "^2.1.6",
|
||||||
"@radix-ui/react-tooltip": "^1.1.8",
|
"@radix-ui/react-tooltip": "^1.1.8",
|
||||||
@ -21,18 +21,18 @@
|
|||||||
"@vercel/analytics": "^1.5.0",
|
"@vercel/analytics": "^1.5.0",
|
||||||
"@vercel/blob": "^0.27.1",
|
"@vercel/blob": "^0.27.1",
|
||||||
"@vercel/speed-insights": "^1.2.0",
|
"@vercel/speed-insights": "^1.2.0",
|
||||||
"ai": "^4.1.34",
|
"ai": "^4.1.41",
|
||||||
"camelcase-keys": "^9.1.3",
|
"camelcase-keys": "^9.1.3",
|
||||||
"cmdk": "^1.0.4",
|
"cmdk": "^1.0.4",
|
||||||
"date-fns": "^4.1.0",
|
"date-fns": "^4.1.0",
|
||||||
"date-fns-tz": "^3.2.0",
|
"date-fns-tz": "^3.2.0",
|
||||||
"exifr": "^7.1.3",
|
"exifr": "^7.1.3",
|
||||||
"framer-motion": "^12.4.2",
|
"framer-motion": "^12.4.3",
|
||||||
"nanoid": "^5.0.9",
|
"nanoid": "^5.1.0",
|
||||||
"next": "15.1.7",
|
"next": "15.1.7",
|
||||||
"next-auth": "5.0.0-beta.25",
|
"next-auth": "5.0.0-beta.25",
|
||||||
"next-themes": "^0.4.4",
|
"next-themes": "^0.4.4",
|
||||||
"pg": "^8.13.1",
|
"pg": "^8.13.3",
|
||||||
"react": "19.0.0",
|
"react": "19.0.0",
|
||||||
"react-dom": "19.0.0",
|
"react-dom": "19.0.0",
|
||||||
"react-icons": "^5.4.0",
|
"react-icons": "^5.4.0",
|
||||||
@ -45,7 +45,9 @@
|
|||||||
"viewerjs": "^1.11.7"
|
"viewerjs": "^1.11.7"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@eslint/eslintrc": "^3.2.0",
|
||||||
"@next/bundle-analyzer": "15.1.7",
|
"@next/bundle-analyzer": "15.1.7",
|
||||||
|
"@next/eslint-plugin-next": "^15.1.7",
|
||||||
"@tailwindcss/container-queries": "^0.1.1",
|
"@tailwindcss/container-queries": "^0.1.1",
|
||||||
"@tailwindcss/forms": "^0.5.10",
|
"@tailwindcss/forms": "^0.5.10",
|
||||||
"@tailwindcss/postcss": "^4.0.6",
|
"@tailwindcss/postcss": "^4.0.6",
|
||||||
@ -53,20 +55,27 @@
|
|||||||
"@testing-library/jest-dom": "^6.6.3",
|
"@testing-library/jest-dom": "^6.6.3",
|
||||||
"@testing-library/react": "^16.2.0",
|
"@testing-library/react": "^16.2.0",
|
||||||
"@types/jest": "^29.5.14",
|
"@types/jest": "^29.5.14",
|
||||||
"@types/node": "^22.13.1",
|
"@types/node": "^22.13.4",
|
||||||
"@types/pg": "^8.11.11",
|
"@types/pg": "^8.11.11",
|
||||||
"@types/react": "19.0.8",
|
"@types/react": "19.0.10",
|
||||||
"@types/react-dom": "19.0.3",
|
"@types/react-dom": "19.0.4",
|
||||||
"@types/sanitize-html": "^2.13.0",
|
"@types/sanitize-html": "^2.13.0",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"cross-fetch": "^4.1.0",
|
"cross-fetch": "^4.1.0",
|
||||||
"eslint": "9.20.0",
|
"eslint": "9.20.1",
|
||||||
"eslint-config-next": "15.1.7",
|
"eslint-config-next": "15.1.7",
|
||||||
|
"eslint-plugin-react-hooks": "^5.1.0",
|
||||||
"jest": "^29.7.0",
|
"jest": "^29.7.0",
|
||||||
"jest-environment-jsdom": "^29.7.0",
|
"jest-environment-jsdom": "^29.7.0",
|
||||||
"postcss": "8.5.2",
|
"postcss": "8.5.2",
|
||||||
"tailwindcss": "4.0.6",
|
"tailwindcss": "4.0.6",
|
||||||
"ts-node": "^10.9.2",
|
"ts-node": "^10.9.2",
|
||||||
"typescript": "5.7.3"
|
"typescript": "5.7.3"
|
||||||
|
},
|
||||||
|
"pnpm": {
|
||||||
|
"onlyBuiltDependencies": [
|
||||||
|
"@vercel/speed-insights",
|
||||||
|
"sharp"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2966
pnpm-lock.yaml
generated
2966
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@ -4,7 +4,7 @@ import ErrorNote from '@/components/ErrorNote';
|
|||||||
import FieldSetWithStatus from '@/components/FieldSetWithStatus';
|
import FieldSetWithStatus from '@/components/FieldSetWithStatus';
|
||||||
import Container from '@/components/Container';
|
import Container from '@/components/Container';
|
||||||
import { addAllUploadsAction } from '@/photo/actions';
|
import { addAllUploadsAction } from '@/photo/actions';
|
||||||
import { PATH_ADMIN_PHOTOS } from '@/app-core/paths';
|
import { PATH_ADMIN_PHOTOS } from '@/app/paths';
|
||||||
import { Tags } from '@/tag';
|
import { Tags } from '@/tag';
|
||||||
import {
|
import {
|
||||||
generateLocalNaivePostgresString,
|
generateLocalNaivePostgresString,
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { Suspense } from 'react';
|
import { Suspense } from 'react';
|
||||||
import { APP_CONFIGURATION } from '@/app-core/config';
|
import { APP_CONFIGURATION } from '@/app/config';
|
||||||
import AdminAppConfigurationServer from './AdminAppConfigurationServer';
|
import AdminAppConfigurationServer from './AdminAppConfigurationServer';
|
||||||
import AdminAppConfigurationClient from './AdminAppConfigurationClient';
|
import AdminAppConfigurationClient from './AdminAppConfigurationClient';
|
||||||
|
|
||||||
|
|||||||
@ -13,7 +13,7 @@ import {
|
|||||||
} from 'react-icons/bi';
|
} from 'react-icons/bi';
|
||||||
import { HiOutlineCog } from 'react-icons/hi';
|
import { HiOutlineCog } from 'react-icons/hi';
|
||||||
import ChecklistGroup from '@/components/ChecklistGroup';
|
import ChecklistGroup from '@/components/ChecklistGroup';
|
||||||
import { ConfigChecklistStatus } from '../app-core/config';
|
import { ConfigChecklistStatus } from '../app/config';
|
||||||
import StatusIcon from '@/components/StatusIcon';
|
import StatusIcon from '@/components/StatusIcon';
|
||||||
import { labelForStorage } from '@/platforms/storage';
|
import { labelForStorage } from '@/platforms/storage';
|
||||||
import { HiSparkles } from 'react-icons/hi';
|
import { HiSparkles } from 'react-icons/hi';
|
||||||
@ -21,7 +21,7 @@ import { testConnectionsAction } from '@/admin/actions';
|
|||||||
import ErrorNote from '@/components/ErrorNote';
|
import ErrorNote from '@/components/ErrorNote';
|
||||||
import WarningNote from '@/components/WarningNote';
|
import WarningNote from '@/components/WarningNote';
|
||||||
import { RiSpeedMiniLine } from 'react-icons/ri';
|
import { RiSpeedMiniLine } from 'react-icons/ri';
|
||||||
import SecretGenerator from '../app-core/SecretGenerator';
|
import SecretGenerator from '../app/SecretGenerator';
|
||||||
import { PiPaintBrushHousehold } from 'react-icons/pi';
|
import { PiPaintBrushHousehold } from 'react-icons/pi';
|
||||||
import { IoMdGrid } from 'react-icons/io';
|
import { IoMdGrid } from 'react-icons/io';
|
||||||
import { CgDebug } from 'react-icons/cg';
|
import { CgDebug } from 'react-icons/cg';
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import AdminAppConfigurationClient from './AdminAppConfigurationClient';
|
import AdminAppConfigurationClient from './AdminAppConfigurationClient';
|
||||||
import { APP_CONFIGURATION } from '@/app-core/config';
|
import { APP_CONFIGURATION } from '@/app/config';
|
||||||
import { testConnectionsAction } from '@/admin/actions';
|
import { testConnectionsAction } from '@/admin/actions';
|
||||||
|
|
||||||
export default async function AdminAppConfigurationServer({
|
export default async function AdminAppConfigurationServer({
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import {
|
|||||||
PATH_ADMIN_CONFIGURATION,
|
PATH_ADMIN_CONFIGURATION,
|
||||||
PATH_ADMIN_INSIGHTS,
|
PATH_ADMIN_INSIGHTS,
|
||||||
PATH_GRID_INFERRED,
|
PATH_GRID_INFERRED,
|
||||||
} from '@/app-core/paths';
|
} from '@/app/paths';
|
||||||
import { useAppState } from '@/state/AppState';
|
import { useAppState } from '@/state/AppState';
|
||||||
import { ImCheckboxUnchecked } from 'react-icons/im';
|
import { ImCheckboxUnchecked } from 'react-icons/im';
|
||||||
import { IoCloseSharp } from 'react-icons/io5';
|
import { IoCloseSharp } from 'react-icons/io5';
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import { IoCloseSharp } from 'react-icons/io5';
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { TAG_FAVS, Tags } from '@/tag';
|
import { TAG_FAVS, Tags } from '@/tag';
|
||||||
import { usePathname } from 'next/navigation';
|
import { usePathname } from 'next/navigation';
|
||||||
import { PATH_GRID_INFERRED } from '@/app-core/paths';
|
import { PATH_GRID_INFERRED } from '@/app/paths';
|
||||||
import PhotoTagFieldset from './PhotoTagFieldset';
|
import PhotoTagFieldset from './PhotoTagFieldset';
|
||||||
import { tagMultiplePhotosAction } from '@/photo/actions';
|
import { tagMultiplePhotosAction } from '@/photo/actions';
|
||||||
import { toastSuccess } from '@/toast';
|
import { toastSuccess } from '@/toast';
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import PhotoUpload from '@/photo/PhotoUpload';
|
import PhotoUpload from '@/photo/PhotoUpload';
|
||||||
import { PATH_ADMIN_PHOTOS } from '@/app-core/paths';
|
import { PATH_ADMIN_PHOTOS } from '@/app/paths';
|
||||||
import { useAppState } from '@/state/AppState';
|
import { useAppState } from '@/state/AppState';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import {
|
|||||||
PATH_ADMIN_PHOTOS,
|
PATH_ADMIN_PHOTOS,
|
||||||
PATH_ADMIN_TAGS,
|
PATH_ADMIN_TAGS,
|
||||||
PATH_ADMIN_UPLOADS,
|
PATH_ADMIN_UPLOADS,
|
||||||
} from '@/app-core/paths';
|
} from '@/app/paths';
|
||||||
import AdminNavClient from './AdminNavClient';
|
import AdminNavClient from './AdminNavClient';
|
||||||
|
|
||||||
export default async function AdminNav() {
|
export default async function AdminNav() {
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import {
|
|||||||
isPathAdminConfiguration,
|
isPathAdminConfiguration,
|
||||||
isPathAdminInsights,
|
isPathAdminInsights,
|
||||||
isPathTopLevelAdmin,
|
isPathTopLevelAdmin,
|
||||||
} from '@/app-core/paths';
|
} from '@/app/paths';
|
||||||
import { useAppState } from '@/state/AppState';
|
import { useAppState } from '@/state/AppState';
|
||||||
import { clsx } from 'clsx/lite';
|
import { clsx } from 'clsx/lite';
|
||||||
import { differenceInMinutes } from 'date-fns';
|
import { differenceInMinutes } from 'date-fns';
|
||||||
|
|||||||
@ -3,10 +3,10 @@
|
|||||||
import { OUTDATED_THRESHOLD, Photo } from '@/photo';
|
import { OUTDATED_THRESHOLD, Photo } from '@/photo';
|
||||||
import AdminPhotosTable from '@/admin/AdminPhotosTable';
|
import AdminPhotosTable from '@/admin/AdminPhotosTable';
|
||||||
import LoaderButton from '@/components/primitives/LoaderButton';
|
import LoaderButton from '@/components/primitives/LoaderButton';
|
||||||
import IconGrSync from '@/app-core/IconGrSync';
|
import IconGrSync from '@/app/IconGrSync';
|
||||||
import Note from '@/components/Note';
|
import Note from '@/components/Note';
|
||||||
import AdminChildPage from '@/components/AdminChildPage';
|
import AdminChildPage from '@/components/AdminChildPage';
|
||||||
import { PATH_ADMIN_PHOTOS } from '@/app-core/paths';
|
import { PATH_ADMIN_PHOTOS } from '@/app/paths';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { syncPhotosAction } from '@/photo/actions';
|
import { syncPhotosAction } from '@/photo/actions';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { ComponentProps, useMemo } from 'react';
|
import { ComponentProps, useMemo } from 'react';
|
||||||
import { pathForAdminPhotoEdit, pathForPhoto } from '@/app-core/paths';
|
import { pathForAdminPhotoEdit, pathForPhoto } from '@/app/paths';
|
||||||
import { deletePhotoAction, toggleFavoritePhotoAction } from '@/photo/actions';
|
import { deletePhotoAction, toggleFavoritePhotoAction } from '@/photo/actions';
|
||||||
import { FaRegEdit, FaRegStar, FaStar } from 'react-icons/fa';
|
import { FaRegEdit, FaRegStar, FaStar } from 'react-icons/fa';
|
||||||
import {
|
import {
|
||||||
|
|||||||
@ -6,11 +6,11 @@ import SiteGrid from '@/components/SiteGrid';
|
|||||||
import {
|
import {
|
||||||
AI_TEXT_GENERATION_ENABLED,
|
AI_TEXT_GENERATION_ENABLED,
|
||||||
PRESERVE_ORIGINAL_UPLOADS,
|
PRESERVE_ORIGINAL_UPLOADS,
|
||||||
} from '@/app-core/config';
|
} from '@/app/config';
|
||||||
import AdminPhotosTable from '@/admin/AdminPhotosTable';
|
import AdminPhotosTable from '@/admin/AdminPhotosTable';
|
||||||
import AdminPhotosTableInfinite from '@/admin/AdminPhotosTableInfinite';
|
import AdminPhotosTableInfinite from '@/admin/AdminPhotosTableInfinite';
|
||||||
import PathLoaderButton from '@/components/primitives/PathLoaderButton';
|
import PathLoaderButton from '@/components/primitives/PathLoaderButton';
|
||||||
import { PATH_ADMIN_OUTDATED } from '@/app-core/paths';
|
import { PATH_ADMIN_OUTDATED } from '@/app/paths';
|
||||||
import { Photo } from '@/photo';
|
import { Photo } from '@/photo';
|
||||||
import { StorageListResponse } from '@/platforms/storage';
|
import { StorageListResponse } from '@/platforms/storage';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import AdminTable from './AdminTable';
|
|||||||
import { Fragment } from 'react';
|
import { Fragment } from 'react';
|
||||||
import PhotoSmall from '@/photo/PhotoSmall';
|
import PhotoSmall from '@/photo/PhotoSmall';
|
||||||
import { clsx } from 'clsx/lite';
|
import { clsx } from 'clsx/lite';
|
||||||
import { pathForAdminPhotoEdit, pathForPhoto } from '@/app-core/paths';
|
import { pathForAdminPhotoEdit, pathForPhoto } from '@/app/paths';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { AiOutlineEyeInvisible } from 'react-icons/ai';
|
import { AiOutlineEyeInvisible } from 'react-icons/ai';
|
||||||
import PhotoDate from '@/photo/PhotoDate';
|
import PhotoDate from '@/photo/PhotoDate';
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { PATH_ADMIN_PHOTOS } from '@/app-core/paths';
|
import { PATH_ADMIN_PHOTOS } from '@/app/paths';
|
||||||
import InfinitePhotoScroll from '../photo/InfinitePhotoScroll';
|
import InfinitePhotoScroll from '../photo/InfinitePhotoScroll';
|
||||||
import AdminPhotosTable from './AdminPhotosTable';
|
import AdminPhotosTable from './AdminPhotosTable';
|
||||||
import { ComponentProps } from 'react';
|
import { ComponentProps } from 'react';
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import DeleteFormButton from '@/admin/DeleteFormButton';
|
|||||||
import { photoQuantityText } from '@/photo';
|
import { photoQuantityText } from '@/photo';
|
||||||
import { Tags, formatTag, sortTagsObject } from '@/tag';
|
import { Tags, formatTag, sortTagsObject } from '@/tag';
|
||||||
import EditButton from '@/admin/EditButton';
|
import EditButton from '@/admin/EditButton';
|
||||||
import { pathForAdminTagEdit } from '@/app-core/paths';
|
import { pathForAdminTagEdit } from '@/app/paths';
|
||||||
import { clsx } from 'clsx/lite';
|
import { clsx } from 'clsx/lite';
|
||||||
import AdminTagBadge from './AdminTagBadge';
|
import AdminTagBadge from './AdminTagBadge';
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import Spinner from '@/components/Spinner';
|
|||||||
import { getIdFromStorageUrl } from '@/platforms/storage';
|
import { getIdFromStorageUrl } from '@/platforms/storage';
|
||||||
import { clsx } from 'clsx/lite';
|
import { clsx } from 'clsx/lite';
|
||||||
import { FaRegCircleCheck } from 'react-icons/fa6';
|
import { FaRegCircleCheck } from 'react-icons/fa6';
|
||||||
import { pathForAdminUploadUrl } from '@/app-core/paths';
|
import { pathForAdminUploadUrl } from '@/app/paths';
|
||||||
import AddButton from './AddButton';
|
import AddButton from './AddButton';
|
||||||
import { UrlAddStatus } from './AdminUploadsClient';
|
import { UrlAddStatus } from './AdminUploadsClient';
|
||||||
import ResponsiveDate from '@/components/ResponsiveDate';
|
import ResponsiveDate from '@/components/ResponsiveDate';
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
import { deleteUploadAction } from '@/photo/actions';
|
import { deleteUploadAction } from '@/photo/actions';
|
||||||
import DeleteButton from './DeleteButton';
|
import DeleteButton from './DeleteButton';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
import { PATH_ADMIN_PHOTOS } from '@/app-core/paths';
|
import { PATH_ADMIN_PHOTOS } from '@/app/paths';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
|
|
||||||
export default function DeleteUploadButton({
|
export default function DeleteUploadButton({
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import LoaderButton from '@/components/primitives/LoaderButton';
|
|||||||
import SubmitButtonWithStatus from '@/components/SubmitButtonWithStatus';
|
import SubmitButtonWithStatus from '@/components/SubmitButtonWithStatus';
|
||||||
import { getExifDataAction } from '@/photo/actions';
|
import { getExifDataAction } from '@/photo/actions';
|
||||||
import { PhotoFormData } from '@/photo/form';
|
import { PhotoFormData } from '@/photo/form';
|
||||||
import IconGrSync from '@/app-core/IconGrSync';
|
import IconGrSync from '@/app/IconGrSync';
|
||||||
import { clsx } from 'clsx/lite';
|
import { clsx } from 'clsx/lite';
|
||||||
import { ComponentProps, useState } from 'react';
|
import { ComponentProps, useState } from 'react';
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import LoaderButton from '@/components/primitives/LoaderButton';
|
import LoaderButton from '@/components/primitives/LoaderButton';
|
||||||
import { syncPhotoAction } from '@/photo/actions';
|
import { syncPhotoAction } from '@/photo/actions';
|
||||||
import IconGrSync from '@/app-core/IconGrSync';
|
import IconGrSync from '@/app/IconGrSync';
|
||||||
import { toastSuccess } from '@/toast';
|
import { toastSuccess } from '@/toast';
|
||||||
import { ComponentProps, useState } from 'react';
|
import { ComponentProps, useState } from 'react';
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import { testRedisConnection } from '@/platforms/redis';
|
|||||||
import { testOpenAiConnection } from '@/platforms/openai';
|
import { testOpenAiConnection } from '@/platforms/openai';
|
||||||
import { testDatabaseConnection } from '@/platforms/postgres';
|
import { testDatabaseConnection } from '@/platforms/postgres';
|
||||||
import { testStorageConnection } from '@/platforms/storage';
|
import { testStorageConnection } from '@/platforms/storage';
|
||||||
import { APP_CONFIGURATION } from '@/app-core/config';
|
import { APP_CONFIGURATION } from '@/app/config';
|
||||||
|
|
||||||
const scanForError = (
|
const scanForError = (
|
||||||
shouldCheck: boolean,
|
shouldCheck: boolean,
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import {
|
|||||||
HAS_STATIC_OPTIMIZATION,
|
HAS_STATIC_OPTIMIZATION,
|
||||||
IS_PRODUCTION,
|
IS_PRODUCTION,
|
||||||
MATTE_PHOTOS,
|
MATTE_PHOTOS,
|
||||||
} from '@/app-core/config';
|
} from '@/app/config';
|
||||||
import { OUTDATED_THRESHOLD } from '@/photo';
|
import { OUTDATED_THRESHOLD } from '@/photo';
|
||||||
import { getGitHubMetaForCurrentApp, getSignificantInsights } from '.';
|
import { getGitHubMetaForCurrentApp, getSignificantInsights } from '.';
|
||||||
|
|
||||||
|
|||||||
@ -20,7 +20,7 @@ import {
|
|||||||
VERCEL_GIT_COMMIT_MESSAGE,
|
VERCEL_GIT_COMMIT_MESSAGE,
|
||||||
TEMPLATE_REPO_URL_FORK,
|
TEMPLATE_REPO_URL_FORK,
|
||||||
TEMPLATE_REPO_URL_README,
|
TEMPLATE_REPO_URL_README,
|
||||||
} from '@/app-core/config';
|
} from '@/app/config';
|
||||||
import {
|
import {
|
||||||
AdminAppInsights,
|
AdminAppInsights,
|
||||||
getGitHubMetaForCurrentApp,
|
getGitHubMetaForCurrentApp,
|
||||||
@ -30,7 +30,7 @@ import {
|
|||||||
import EnvVar from '@/components/EnvVar';
|
import EnvVar from '@/components/EnvVar';
|
||||||
import { IoSyncCircle } from 'react-icons/io5';
|
import { IoSyncCircle } from 'react-icons/io5';
|
||||||
import clsx from 'clsx/lite';
|
import clsx from 'clsx/lite';
|
||||||
import { PATH_ADMIN_OUTDATED } from '@/app-core/paths';
|
import { PATH_ADMIN_OUTDATED } from '@/app/paths';
|
||||||
import { LiaBroomSolid } from 'react-icons/lia';
|
import { LiaBroomSolid } from 'react-icons/lia';
|
||||||
import { IoMdGrid } from 'react-icons/io';
|
import { IoMdGrid } from 'react-icons/io';
|
||||||
import { RiSpeedMiniLine } from 'react-icons/ri';
|
import { RiSpeedMiniLine } from 'react-icons/ri';
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import {
|
|||||||
IS_VERCEL_GIT_PROVIDER_GITHUB,
|
IS_VERCEL_GIT_PROVIDER_GITHUB,
|
||||||
IS_DEVELOPMENT,
|
IS_DEVELOPMENT,
|
||||||
APP_CONFIGURATION,
|
APP_CONFIGURATION,
|
||||||
} from '@/app-core/config';
|
} from '@/app/config';
|
||||||
import { PhotoDateRange } from '@/photo';
|
import { PhotoDateRange } from '@/photo';
|
||||||
import { getGitHubMeta } from '@/platforms/github';
|
import { getGitHubMeta } from '@/platforms/github';
|
||||||
|
|
||||||
|
|||||||
@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
import { clsx } from 'clsx/lite';
|
import { clsx } from 'clsx/lite';
|
||||||
import SiteGrid from '../components/SiteGrid';
|
import SiteGrid from '../components/SiteGrid';
|
||||||
import ThemeSwitcher from '@/app-core/ThemeSwitcher';
|
import ThemeSwitcher from '@/app/ThemeSwitcher';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { SHOW_REPO_LINK } from '@/app-core/config';
|
import { SHOW_REPO_LINK } from '@/app/config';
|
||||||
import RepoLink from '../components/RepoLink';
|
import RepoLink from '../components/RepoLink';
|
||||||
import { usePathname } from 'next/navigation';
|
import { usePathname } from 'next/navigation';
|
||||||
import { PATH_ADMIN_PHOTOS, isPathAdmin, isPathSignIn } from './paths';
|
import { PATH_ADMIN_PHOTOS, isPathAdmin, isPathSignIn } from './paths';
|
||||||
@ -4,7 +4,7 @@ import { clsx } from 'clsx/lite';
|
|||||||
import { usePathname } from 'next/navigation';
|
import { usePathname } from 'next/navigation';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import SiteGrid from '../components/SiteGrid';
|
import SiteGrid from '../components/SiteGrid';
|
||||||
import ViewSwitcher, { SwitcherSelection } from '@/app-core/ViewSwitcher';
|
import ViewSwitcher, { SwitcherSelection } from '@/app/ViewSwitcher';
|
||||||
import {
|
import {
|
||||||
PATH_ROOT,
|
PATH_ROOT,
|
||||||
isPathAdmin,
|
isPathAdmin,
|
||||||
@ -12,7 +12,7 @@ import {
|
|||||||
isPathGrid,
|
isPathGrid,
|
||||||
isPathProtected,
|
isPathProtected,
|
||||||
isPathSignIn,
|
isPathSignIn,
|
||||||
} from '@/app-core/paths';
|
} from '@/app/paths';
|
||||||
import AnimateItems from '../components/AnimateItems';
|
import AnimateItems from '../components/AnimateItems';
|
||||||
import { useAppState } from '@/state/AppState';
|
import { useAppState } from '@/state/AppState';
|
||||||
import {
|
import {
|
||||||
@ -1,12 +1,12 @@
|
|||||||
import Switcher from '@/components/Switcher';
|
import Switcher from '@/components/Switcher';
|
||||||
import SwitcherItem from '@/components/SwitcherItem';
|
import SwitcherItem from '@/components/SwitcherItem';
|
||||||
import IconFeed from '@/app-core/IconFeed';
|
import IconFeed from '@/app/IconFeed';
|
||||||
import IconGrid from '@/app-core/IconGrid';
|
import IconGrid from '@/app/IconGrid';
|
||||||
import {
|
import {
|
||||||
PATH_ADMIN_PHOTOS,
|
PATH_ADMIN_PHOTOS,
|
||||||
PATH_FEED_INFERRED,
|
PATH_FEED_INFERRED,
|
||||||
PATH_GRID_INFERRED,
|
PATH_GRID_INFERRED,
|
||||||
} from '@/app-core/paths';
|
} from '@/app/paths';
|
||||||
import { BiLockAlt } from 'react-icons/bi';
|
import { BiLockAlt } from 'react-icons/bi';
|
||||||
import IconSearch from './IconSearch';
|
import IconSearch from './IconSearch';
|
||||||
import { useAppState } from '@/state/AppState';
|
import { useAppState } from '@/state/AppState';
|
||||||
@ -10,7 +10,7 @@ import {
|
|||||||
signIn,
|
signIn,
|
||||||
signOut,
|
signOut,
|
||||||
} from '@/auth';
|
} from '@/auth';
|
||||||
import { PATH_ADMIN_PHOTOS, PATH_ROOT } from '@/app-core/paths';
|
import { PATH_ADMIN_PHOTOS, PATH_ROOT } from '@/app/paths';
|
||||||
import type { Session } from 'next-auth';
|
import type { Session } from 'next-auth';
|
||||||
import { redirect } from 'next/navigation';
|
import { redirect } from 'next/navigation';
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { isPathProtected } from '@/app-core/paths';
|
import { isPathProtected } from '@/app/paths';
|
||||||
import NextAuth, { User } from 'next-auth';
|
import NextAuth, { User } from 'next-auth';
|
||||||
import Credentials from 'next-auth/providers/credentials';
|
import Credentials from 'next-auth/providers/credentials';
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { Photo, PhotoDateRange } from '@/photo';
|
import { Photo, PhotoDateRange } from '@/photo';
|
||||||
import { absolutePathForCameraImage, pathForCamera } from '@/app-core/paths';
|
import { absolutePathForCameraImage, pathForCamera } from '@/app/paths';
|
||||||
import OGTile from '@/components/OGTile';
|
import OGTile from '@/components/OGTile';
|
||||||
import { Camera } from '.';
|
import { Camera } from '.';
|
||||||
import { descriptionForCameraPhotos, titleForCamera } from './meta';
|
import { descriptionForCameraPhotos, titleForCamera } from './meta';
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { absolutePathForCamera } from '@/app-core/paths';
|
import { absolutePathForCamera } from '@/app/paths';
|
||||||
import { PhotoSetAttributes } from '../photo';
|
import { PhotoSetAttributes } from '../photo';
|
||||||
import ShareModal from '@/share/ShareModal';
|
import ShareModal from '@/share/ShareModal';
|
||||||
import CameraOGTile from './CameraOGTile';
|
import CameraOGTile from './CameraOGTile';
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { AiFillApple } from 'react-icons/ai';
|
import { AiFillApple } from 'react-icons/ai';
|
||||||
import { pathForCamera } from '@/app-core/paths';
|
import { pathForCamera } from '@/app/paths';
|
||||||
import { IoMdCamera } from 'react-icons/io';
|
import { IoMdCamera } from 'react-icons/io';
|
||||||
import { Camera, formatCameraText, isCameraApple } from '.';
|
import { Camera, formatCameraText, isCameraApple } from '.';
|
||||||
import EntityLink, {
|
import EntityLink, {
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import { Camera, cameraFromPhoto, formatCameraText } from '.';
|
|||||||
import {
|
import {
|
||||||
absolutePathForCamera,
|
absolutePathForCamera,
|
||||||
absolutePathForCameraImage,
|
absolutePathForCameraImage,
|
||||||
} from '@/app-core/paths';
|
} from '@/app/paths';
|
||||||
|
|
||||||
// Meta functions moved to separate file to avoid
|
// Meta functions moved to separate file to avoid
|
||||||
// dependencies (camelcase-keys) found in photo/index.ts
|
// dependencies (camelcase-keys) found in photo/index.ts
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
import SiteGrid from './SiteGrid';
|
import SiteGrid from './SiteGrid';
|
||||||
import { clsx } from 'clsx/lite';
|
import { clsx } from 'clsx/lite';
|
||||||
import { PATH_ROOT } from '@/app-core/paths';
|
import { PATH_ROOT } from '@/app/paths';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
|
|
||||||
export default function HttpStatusPage({
|
export default function HttpStatusPage({
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import { clsx } from 'clsx/lite';
|
|||||||
import useClickInsideOutside from '@/utility/useClickInsideOutside';
|
import useClickInsideOutside from '@/utility/useClickInsideOutside';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
import AnimateItems from './AnimateItems';
|
import AnimateItems from './AnimateItems';
|
||||||
import { PATH_ROOT } from '@/app-core/paths';
|
import { PATH_ROOT } from '@/app/paths';
|
||||||
import usePrefersReducedMotion from '@/utility/usePrefersReducedMotion';
|
import usePrefersReducedMotion from '@/utility/usePrefersReducedMotion';
|
||||||
import useMetaThemeColor from '@/utility/useMetaThemeColor';
|
import useMetaThemeColor from '@/utility/useMetaThemeColor';
|
||||||
import useEscapeHandler from '@/utility/useEscapeHandler';
|
import useEscapeHandler from '@/utility/useEscapeHandler';
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { TEMPLATE_REPO_NAME, TEMPLATE_REPO_URL } from '@/app-core/config';
|
import { TEMPLATE_REPO_NAME, TEMPLATE_REPO_URL } from '@/app/config';
|
||||||
import { clsx } from 'clsx/lite';
|
import { clsx } from 'clsx/lite';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { BiLogoGithub } from 'react-icons/bi';
|
import { BiLogoGithub } from 'react-icons/bi';
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { clsx } from 'clsx/lite';
|
import { clsx } from 'clsx/lite';
|
||||||
import { SHOULD_PREFETCH_ALL_LINKS } from '@/app-core/config';
|
import { SHOULD_PREFETCH_ALL_LINKS } from '@/app/config';
|
||||||
import { JSX } from 'react';
|
import { JSX } from 'react';
|
||||||
import Spinner from './Spinner';
|
import Spinner from './Spinner';
|
||||||
import LinkWithLoader from './LinkWithLoader';
|
import LinkWithLoader from './LinkWithLoader';
|
||||||
|
|||||||
@ -22,7 +22,7 @@ import {
|
|||||||
PATH_SIGN_IN,
|
PATH_SIGN_IN,
|
||||||
pathForPhoto,
|
pathForPhoto,
|
||||||
pathForTag,
|
pathForTag,
|
||||||
} from '../../app-core/paths';
|
} from '../../app/paths';
|
||||||
import Modal from '../Modal';
|
import Modal from '../Modal';
|
||||||
import { clsx } from 'clsx/lite';
|
import { clsx } from 'clsx/lite';
|
||||||
import { useDebounce } from 'use-debounce';
|
import { useDebounce } from 'use-debounce';
|
||||||
@ -46,7 +46,7 @@ import { Tags, addHiddenToTags, formatTag } from '@/tag';
|
|||||||
import { FaTag } from 'react-icons/fa';
|
import { FaTag } from 'react-icons/fa';
|
||||||
import { formatCount, formatCountDescriptive } from '@/utility/string';
|
import { formatCount, formatCountDescriptive } from '@/utility/string';
|
||||||
import CommandKItem from './CommandKItem';
|
import CommandKItem from './CommandKItem';
|
||||||
import { GRID_HOMEPAGE_ENABLED } from '@/app-core/config';
|
import { GRID_HOMEPAGE_ENABLED } from '@/app/config';
|
||||||
import { DialogDescription, DialogTitle } from '@radix-ui/react-dialog';
|
import { DialogDescription, DialogTitle } from '@radix-ui/react-dialog';
|
||||||
import * as VisuallyHidden from '@radix-ui/react-visually-hidden';
|
import * as VisuallyHidden from '@radix-ui/react-visually-hidden';
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { IMAGE_QUALITY } from '@/app-core/config';
|
import { IMAGE_QUALITY } from '@/app/config';
|
||||||
import { IMAGE_WIDTH_LARGE, ImageProps } from '.';
|
import { IMAGE_WIDTH_LARGE, ImageProps } from '.';
|
||||||
import ImageWithFallback from './ImageWithFallback';
|
import ImageWithFallback from './ImageWithFallback';
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user