diff --git a/package.json b/package.json index 083cb621..53c6716b 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,10 @@ "@testing-library/react": "^14.1.2", "@types/jest": "^29.5.11", "@types/node": "^20.10.6", - "@types/react": "18.2.46", + "@types/react": "18.2.47", "@types/react-dom": "18.2.18", - "@typescript-eslint/eslint-plugin": "^6.17.0", - "@typescript-eslint/parser": "^6.17.0", + "@typescript-eslint/eslint-plugin": "^6.18.0", + "@typescript-eslint/parser": "^6.18.0", "@vercel/analytics": "^1.1.1", "@vercel/blob": "^0.16.1", "@vercel/postgres": "0.5.1", @@ -44,7 +44,7 @@ "react-dom": "18.2.0", "react-icons": "^4.12.0", "sonner": "^1.3.1", - "tailwindcss": "3.4.0", + "tailwindcss": "3.4.1", "ts-exif-parser": "^0.2.2", "typescript": "5.3.3" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2941470b..b6162f91 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,7 +16,7 @@ dependencies: version: 14.0.4 '@tailwindcss/forms': specifier: ^0.5.7 - version: 0.5.7(tailwindcss@3.4.0) + version: 0.5.7(tailwindcss@3.4.1) '@testing-library/jest-dom': specifier: ^6.2.0 version: 6.2.0(@types/jest@29.5.11)(jest@29.7.0) @@ -30,17 +30,17 @@ dependencies: specifier: ^20.10.6 version: 20.10.6 '@types/react': - specifier: 18.2.46 - version: 18.2.46 + specifier: 18.2.47 + version: 18.2.47 '@types/react-dom': specifier: 18.2.18 version: 18.2.18 '@typescript-eslint/eslint-plugin': - specifier: ^6.17.0 - version: 6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3) + specifier: ^6.18.0 + version: 6.18.0(@typescript-eslint/parser@6.18.0)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': - specifier: ^6.17.0 - version: 6.17.0(eslint@8.56.0)(typescript@5.3.3) + specifier: ^6.18.0 + version: 6.18.0(eslint@8.56.0)(typescript@5.3.3) '@vercel/analytics': specifier: ^1.1.1 version: 1.1.1 @@ -111,8 +111,8 @@ dependencies: specifier: ^1.3.1 version: 1.3.1(react-dom@18.2.0)(react@18.2.0) tailwindcss: - specifier: 3.4.0 - version: 3.4.0 + specifier: 3.4.1 + version: 3.4.1 ts-exif-parser: specifier: ^0.2.2 version: 0.2.2 @@ -2118,13 +2118,13 @@ packages: tslib: 2.6.2 dev: false - /@tailwindcss/forms@0.5.7(tailwindcss@3.4.0): + /@tailwindcss/forms@0.5.7(tailwindcss@3.4.1): resolution: {integrity: sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==} peerDependencies: tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.4.0 + tailwindcss: 3.4.1 dev: false /@testing-library/dom@9.3.3: @@ -2289,11 +2289,11 @@ packages: /@types/react-dom@18.2.18: resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} dependencies: - '@types/react': 18.2.46 + '@types/react': 18.2.47 dev: false - /@types/react@18.2.46: - resolution: {integrity: sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==} + /@types/react@18.2.47: + resolution: {integrity: sha512-xquNkkOirwyCgoClNk85BjP+aqnIS+ckAJ8i37gAbDs14jfW/J23f2GItAf33oiUPQnqNMALiFeoM9Y5mbjpVQ==} dependencies: '@types/prop-types': 15.7.11 '@types/scheduler': 0.16.8 @@ -2326,8 +2326,8 @@ packages: '@types/yargs-parser': 21.0.3 dev: false - /@typescript-eslint/eslint-plugin@6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==} + /@typescript-eslint/eslint-plugin@6.18.0(@typescript-eslint/parser@6.18.0)(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-3lqEvQUdCozi6d1mddWqd+kf8KxmGq2Plzx36BlkjuQe3rSTm/O98cLf0A4uDO+a5N1KD2SeEEl6fW97YHY+6w==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -2338,11 +2338,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 6.17.0 - '@typescript-eslint/type-utils': 6.17.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.17.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.17.0 + '@typescript-eslint/parser': 6.18.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.18.0 + '@typescript-eslint/type-utils': 6.18.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.18.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.18.0 debug: 4.3.4 eslint: 8.56.0 graphemer: 1.4.0 @@ -2355,8 +2355,8 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@6.17.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==} + /@typescript-eslint/parser@6.18.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-v6uR68SFvqhNQT41frCMCQpsP+5vySy6IdgjlzUWoo7ALCnpaWYcz/Ij2k4L8cEsL0wkvOviCMpjmtRtHNOKzA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2365,10 +2365,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.17.0 - '@typescript-eslint/types': 6.17.0 - '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.17.0 + '@typescript-eslint/scope-manager': 6.18.0 + '@typescript-eslint/types': 6.18.0 + '@typescript-eslint/typescript-estree': 6.18.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.18.0 debug: 4.3.4 eslint: 8.56.0 typescript: 5.3.3 @@ -2376,16 +2376,16 @@ packages: - supports-color dev: false - /@typescript-eslint/scope-manager@6.17.0: - resolution: {integrity: sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==} + /@typescript-eslint/scope-manager@6.18.0: + resolution: {integrity: sha512-o/UoDT2NgOJ2VfHpfr+KBY2ErWvCySNUIX/X7O9g8Zzt/tXdpfEU43qbNk8LVuWUT2E0ptzTWXh79i74PP0twA==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.17.0 - '@typescript-eslint/visitor-keys': 6.17.0 + '@typescript-eslint/types': 6.18.0 + '@typescript-eslint/visitor-keys': 6.18.0 dev: false - /@typescript-eslint/type-utils@6.17.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==} + /@typescript-eslint/type-utils@6.18.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-ZeMtrXnGmTcHciJN1+u2CigWEEXgy1ufoxtWcHORt5kGvpjjIlK9MUhzHm4RM8iVy6dqSaZA/6PVkX6+r+ChjQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2394,8 +2394,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) - '@typescript-eslint/utils': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.18.0(typescript@5.3.3) + '@typescript-eslint/utils': 6.18.0(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 eslint: 8.56.0 ts-api-utils: 1.0.3(typescript@5.3.3) @@ -2404,13 +2404,13 @@ packages: - supports-color dev: false - /@typescript-eslint/types@6.17.0: - resolution: {integrity: sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==} + /@typescript-eslint/types@6.18.0: + resolution: {integrity: sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==} engines: {node: ^16.0.0 || >=18.0.0} dev: false - /@typescript-eslint/typescript-estree@6.17.0(typescript@5.3.3): - resolution: {integrity: sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==} + /@typescript-eslint/typescript-estree@6.18.0(typescript@5.3.3): + resolution: {integrity: sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -2418,8 +2418,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.17.0 - '@typescript-eslint/visitor-keys': 6.17.0 + '@typescript-eslint/types': 6.18.0 + '@typescript-eslint/visitor-keys': 6.18.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -2431,8 +2431,8 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@6.17.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==} + /@typescript-eslint/utils@6.18.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-wiKKCbUeDPGaYEYQh1S580dGxJ/V9HI7K5sbGAVklyf+o5g3O+adnS4UNJajplF4e7z2q0uVBaTdT/yLb4XAVA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2440,9 +2440,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.17.0 - '@typescript-eslint/types': 6.17.0 - '@typescript-eslint/typescript-estree': 6.17.0(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.18.0 + '@typescript-eslint/types': 6.18.0 + '@typescript-eslint/typescript-estree': 6.18.0(typescript@5.3.3) eslint: 8.56.0 semver: 7.5.4 transitivePeerDependencies: @@ -2450,11 +2450,11 @@ packages: - typescript dev: false - /@typescript-eslint/visitor-keys@6.17.0: - resolution: {integrity: sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==} + /@typescript-eslint/visitor-keys@6.18.0: + resolution: {integrity: sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.17.0 + '@typescript-eslint/types': 6.18.0 eslint-visitor-keys: 3.4.3 dev: false @@ -3476,11 +3476,11 @@ packages: dependencies: '@next/eslint-plugin-next': 14.0.4 '@rushstack/eslint-patch': 1.6.1 - '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.18.0(eslint@8.56.0)(typescript@5.3.3) eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.18.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.18.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0) eslint-plugin-react: 7.33.2(eslint@8.56.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.56.0) @@ -3500,7 +3500,7 @@ packages: - supports-color dev: false - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.18.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -3510,8 +3510,8 @@ packages: debug: 4.3.4 enhanced-resolve: 5.15.0 eslint: 8.56.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.18.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.18.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) fast-glob: 3.3.2 get-tsconfig: 4.7.2 is-core-module: 2.13.1 @@ -3523,7 +3523,7 @@ packages: - supports-color dev: false - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.18.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -3544,16 +3544,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.18.0(eslint@8.56.0)(typescript@5.3.3) debug: 3.2.7 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.18.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0) transitivePeerDependencies: - supports-color dev: false - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.18.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -3563,7 +3563,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.17.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.18.0(eslint@8.56.0)(typescript@5.3.3) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 @@ -3572,7 +3572,7 @@ packages: doctrine: 2.1.0 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.17.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.18.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -6305,8 +6305,8 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: false - /tailwindcss@3.4.0: - resolution: {integrity: sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==} + /tailwindcss@3.4.1: + resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} engines: {node: '>=14.0.0'} hasBin: true dependencies: diff --git a/src/app/(auth-state)/layout.tsx b/src/app/(auth-state)/layout.tsx deleted file mode 100644 index 1093e968..00000000 --- a/src/app/(auth-state)/layout.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import FooterAuth from '@/site/FooterAuth'; -import PageContentContainer from '@/components/PageContentContainer'; -import { SessionProvider } from 'next-auth/react'; - -export default function RootLayout({ - children, -}: { - children: React.ReactNode -}) { - return ( - - - {children} - - - - ); -} diff --git a/src/app/(static)/layout.tsx b/src/app/(static)/layout.tsx deleted file mode 100644 index f4fa896f..00000000 --- a/src/app/(static)/layout.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import FooterStatic from '@/site/FooterStatic'; -import PageContentContainer from '@/components/PageContentContainer'; - -export default function RootLayout({ - children, -}: { - children: React.ReactNode -}) { - return ( - <> - - {children} - - - - ); -} \ No newline at end of file diff --git a/src/app/(auth-state)/admin/configuration/page.tsx b/src/app/admin/configuration/page.tsx similarity index 100% rename from src/app/(auth-state)/admin/configuration/page.tsx rename to src/app/admin/configuration/page.tsx diff --git a/src/app/(auth-state)/admin/layout.tsx b/src/app/admin/layout.tsx similarity index 100% rename from src/app/(auth-state)/admin/layout.tsx rename to src/app/admin/layout.tsx diff --git a/src/app/(auth-state)/admin/photos/[photoId]/edit/page.tsx b/src/app/admin/photos/[photoId]/edit/page.tsx similarity index 100% rename from src/app/(auth-state)/admin/photos/[photoId]/edit/page.tsx rename to src/app/admin/photos/[photoId]/edit/page.tsx diff --git a/src/app/(auth-state)/admin/photos/page.tsx b/src/app/admin/photos/page.tsx similarity index 100% rename from src/app/(auth-state)/admin/photos/page.tsx rename to src/app/admin/photos/page.tsx diff --git a/src/app/(auth-state)/admin/tags/[tag]/edit/page.tsx b/src/app/admin/tags/[tag]/edit/page.tsx similarity index 100% rename from src/app/(auth-state)/admin/tags/[tag]/edit/page.tsx rename to src/app/admin/tags/[tag]/edit/page.tsx diff --git a/src/app/(auth-state)/admin/tags/page.tsx b/src/app/admin/tags/page.tsx similarity index 100% rename from src/app/(auth-state)/admin/tags/page.tsx rename to src/app/admin/tags/page.tsx diff --git a/src/app/(auth-state)/admin/uploads/[uploadPath]/page.tsx b/src/app/admin/uploads/[uploadPath]/page.tsx similarity index 100% rename from src/app/(auth-state)/admin/uploads/[uploadPath]/page.tsx rename to src/app/admin/uploads/[uploadPath]/page.tsx diff --git a/src/app/(auth-state)/admin/uploads/blob/route.tsx b/src/app/admin/uploads/blob/route.tsx similarity index 100% rename from src/app/(auth-state)/admin/uploads/blob/route.tsx rename to src/app/admin/uploads/blob/route.tsx diff --git a/src/app/(auth-state)/admin/uploads/page.tsx b/src/app/admin/uploads/page.tsx similarity index 100% rename from src/app/(auth-state)/admin/uploads/page.tsx rename to src/app/admin/uploads/page.tsx diff --git a/src/app/(static)/film-demo/animate/page.tsx b/src/app/film-demo/animate/page.tsx similarity index 100% rename from src/app/(static)/film-demo/animate/page.tsx rename to src/app/film-demo/animate/page.tsx diff --git a/src/app/(static)/film-demo/page.tsx b/src/app/film-demo/page.tsx similarity index 100% rename from src/app/(static)/film-demo/page.tsx rename to src/app/film-demo/page.tsx diff --git a/src/app/(static)/film/[simulation]/[photoId]/layout.tsx b/src/app/film/[simulation]/[photoId]/layout.tsx similarity index 100% rename from src/app/(static)/film/[simulation]/[photoId]/layout.tsx rename to src/app/film/[simulation]/[photoId]/layout.tsx diff --git a/src/app/(static)/film/[simulation]/[photoId]/page.tsx b/src/app/film/[simulation]/[photoId]/page.tsx similarity index 100% rename from src/app/(static)/film/[simulation]/[photoId]/page.tsx rename to src/app/film/[simulation]/[photoId]/page.tsx diff --git a/src/app/(static)/film/[simulation]/[photoId]/share/page.tsx b/src/app/film/[simulation]/[photoId]/share/page.tsx similarity index 100% rename from src/app/(static)/film/[simulation]/[photoId]/share/page.tsx rename to src/app/film/[simulation]/[photoId]/share/page.tsx diff --git a/src/app/(static)/film/[simulation]/image/route.tsx b/src/app/film/[simulation]/image/route.tsx similarity index 100% rename from src/app/(static)/film/[simulation]/image/route.tsx rename to src/app/film/[simulation]/image/route.tsx diff --git a/src/app/(static)/film/[simulation]/page.tsx b/src/app/film/[simulation]/page.tsx similarity index 100% rename from src/app/(static)/film/[simulation]/page.tsx rename to src/app/film/[simulation]/page.tsx diff --git a/src/app/(static)/film/[simulation]/share/page.tsx b/src/app/film/[simulation]/share/page.tsx similarity index 100% rename from src/app/(static)/film/[simulation]/share/page.tsx rename to src/app/film/[simulation]/share/page.tsx diff --git a/src/app/(static)/grid/page.tsx b/src/app/grid/page.tsx similarity index 100% rename from src/app/(static)/grid/page.tsx rename to src/app/grid/page.tsx diff --git a/src/app/(static)/home-image/route.tsx b/src/app/home-image/route.tsx similarity index 100% rename from src/app/(static)/home-image/route.tsx rename to src/app/home-image/route.tsx diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 1f822b57..9aeff4bc 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -9,6 +9,10 @@ import ThemeProviderClient from '@/site/ThemeProviderClient'; import Nav from '@/site/Nav'; import ToasterWithThemes from '@/toast/ToasterWithThemes'; import PhotoEscapeHandler from '@/photo/PhotoEscapeHandler'; +import Footer from '@/site/Footer'; +import { Suspense } from 'react'; +import FooterClient from '@/site/FooterClient'; +import NavClient from '@/site/NavClient'; import '../site/globals.css'; @@ -68,21 +72,31 @@ export default function RootLayout({ suppressHydrationWarning > - -
-
- - -
+ + +
+ }> +
+
+
+ + + + ); diff --git a/src/app/(static)/og/page.tsx b/src/app/og/page.tsx similarity index 100% rename from src/app/(static)/og/page.tsx rename to src/app/og/page.tsx diff --git a/src/app/(static)/p/[photoId]/image/route.tsx b/src/app/p/[photoId]/image/route.tsx similarity index 100% rename from src/app/(static)/p/[photoId]/image/route.tsx rename to src/app/p/[photoId]/image/route.tsx diff --git a/src/app/(static)/p/[photoId]/layout.tsx b/src/app/p/[photoId]/layout.tsx similarity index 100% rename from src/app/(static)/p/[photoId]/layout.tsx rename to src/app/p/[photoId]/layout.tsx diff --git a/src/app/(static)/p/[photoId]/page.tsx b/src/app/p/[photoId]/page.tsx similarity index 100% rename from src/app/(static)/p/[photoId]/page.tsx rename to src/app/p/[photoId]/page.tsx diff --git a/src/app/(static)/p/[photoId]/share/page.tsx b/src/app/p/[photoId]/share/page.tsx similarity index 100% rename from src/app/(static)/p/[photoId]/share/page.tsx rename to src/app/p/[photoId]/share/page.tsx diff --git a/src/app/(static)/page.tsx b/src/app/page.tsx similarity index 100% rename from src/app/(static)/page.tsx rename to src/app/page.tsx diff --git a/src/app/(static)/sets/page.tsx b/src/app/sets/page.tsx similarity index 100% rename from src/app/(static)/sets/page.tsx rename to src/app/sets/page.tsx diff --git a/src/app/(static)/shot-on/[camera]/[photoId]/layout.tsx b/src/app/shot-on/[camera]/[photoId]/layout.tsx similarity index 100% rename from src/app/(static)/shot-on/[camera]/[photoId]/layout.tsx rename to src/app/shot-on/[camera]/[photoId]/layout.tsx diff --git a/src/app/(static)/shot-on/[camera]/[photoId]/page.tsx b/src/app/shot-on/[camera]/[photoId]/page.tsx similarity index 100% rename from src/app/(static)/shot-on/[camera]/[photoId]/page.tsx rename to src/app/shot-on/[camera]/[photoId]/page.tsx diff --git a/src/app/(static)/shot-on/[camera]/[photoId]/share/page.tsx b/src/app/shot-on/[camera]/[photoId]/share/page.tsx similarity index 100% rename from src/app/(static)/shot-on/[camera]/[photoId]/share/page.tsx rename to src/app/shot-on/[camera]/[photoId]/share/page.tsx diff --git a/src/app/(static)/shot-on/[camera]/image/route.tsx b/src/app/shot-on/[camera]/image/route.tsx similarity index 100% rename from src/app/(static)/shot-on/[camera]/image/route.tsx rename to src/app/shot-on/[camera]/image/route.tsx diff --git a/src/app/(static)/shot-on/[camera]/page.tsx b/src/app/shot-on/[camera]/page.tsx similarity index 100% rename from src/app/(static)/shot-on/[camera]/page.tsx rename to src/app/shot-on/[camera]/page.tsx diff --git a/src/app/(static)/shot-on/[camera]/share/page.tsx b/src/app/shot-on/[camera]/share/page.tsx similarity index 100% rename from src/app/(static)/shot-on/[camera]/share/page.tsx rename to src/app/shot-on/[camera]/share/page.tsx diff --git a/src/app/(static)/tag/[tag]/[photoId]/layout.tsx b/src/app/tag/[tag]/[photoId]/layout.tsx similarity index 100% rename from src/app/(static)/tag/[tag]/[photoId]/layout.tsx rename to src/app/tag/[tag]/[photoId]/layout.tsx diff --git a/src/app/(static)/tag/[tag]/[photoId]/page.tsx b/src/app/tag/[tag]/[photoId]/page.tsx similarity index 100% rename from src/app/(static)/tag/[tag]/[photoId]/page.tsx rename to src/app/tag/[tag]/[photoId]/page.tsx diff --git a/src/app/(static)/tag/[tag]/[photoId]/share/page.tsx b/src/app/tag/[tag]/[photoId]/share/page.tsx similarity index 100% rename from src/app/(static)/tag/[tag]/[photoId]/share/page.tsx rename to src/app/tag/[tag]/[photoId]/share/page.tsx diff --git a/src/app/(static)/tag/[tag]/image/route.tsx b/src/app/tag/[tag]/image/route.tsx similarity index 100% rename from src/app/(static)/tag/[tag]/image/route.tsx rename to src/app/tag/[tag]/image/route.tsx diff --git a/src/app/(static)/tag/[tag]/page.tsx b/src/app/tag/[tag]/page.tsx similarity index 100% rename from src/app/(static)/tag/[tag]/page.tsx rename to src/app/tag/[tag]/page.tsx diff --git a/src/app/(static)/tag/[tag]/share/page.tsx b/src/app/tag/[tag]/share/page.tsx similarity index 100% rename from src/app/(static)/tag/[tag]/share/page.tsx rename to src/app/tag/[tag]/share/page.tsx diff --git a/src/app/(static)/template-image-tight/route.tsx b/src/app/template-image-tight/route.tsx similarity index 100% rename from src/app/(static)/template-image-tight/route.tsx rename to src/app/template-image-tight/route.tsx diff --git a/src/app/(static)/template-image/route.tsx b/src/app/template-image/route.tsx similarity index 100% rename from src/app/(static)/template-image/route.tsx rename to src/app/template-image/route.tsx diff --git a/src/app/(static)/template-url/route.tsx b/src/app/template-url/route.tsx similarity index 100% rename from src/app/(static)/template-url/route.tsx rename to src/app/template-url/route.tsx diff --git a/src/auth/action.ts b/src/auth/action.ts index 734da6e9..c16db0bd 100644 --- a/src/auth/action.ts +++ b/src/auth/action.ts @@ -9,7 +9,7 @@ export const signInAction = async ( try { await signIn('credentials', Object.fromEntries(formData)); } catch (error) { - if ((error as Error).message.includes(CREDENTIALS_SIGN_IN_ERROR)) { + if ((`${error}`).includes(CREDENTIALS_SIGN_IN_ERROR)) { return CREDENTIALS_SIGN_IN_ERROR; } throw error; diff --git a/src/cache/index.ts b/src/cache/index.ts index db0f2387..ce35f63b 100644 --- a/src/cache/index.ts +++ b/src/cache/index.ts @@ -28,6 +28,8 @@ import { getBlobPhotoUrls, getBlobUploadUrls } from '@/services/blob'; import type { Session } from 'next-auth'; import { createCameraKey } from '@/camera'; import { PATHS_ADMIN } from '@/site/paths'; +import { cache } from 'react'; +import { auth } from '@/auth'; // Table key const KEY_PHOTOS = 'photos'; @@ -207,6 +209,8 @@ export const getUniqueFilmSimulationsCached = [KEY_PHOTOS, KEY_FILM_SIMULATIONS], ); +export const authCached = cache(auth); + // No Store export const getPhotoNoStore = (...args: Parameters) => { diff --git a/src/components/PageContentContainer.tsx b/src/components/PageContentContainer.tsx deleted file mode 100644 index 3915e9c4..00000000 --- a/src/components/PageContentContainer.tsx +++ /dev/null @@ -1,11 +0,0 @@ -export default function PageContentContainer({ - children, -}: { - children: React.ReactNode -}) { - return ( -
- {children} -
- ); -} diff --git a/src/components/RepoLink.tsx b/src/components/RepoLink.tsx index 0d4105e7..cc0b6469 100644 --- a/src/components/RepoLink.tsx +++ b/src/components/RepoLink.tsx @@ -12,12 +12,15 @@ export default function RepoLink() { href="http://github.com/sambecker/exif-photo-blog" target="_blank" className={clsx( - 'flex items-center gap-1', - 'text-black dark:text-white', + 'flex items-center gap-0.5', + 'text-main hover:text-main', 'hover:underline', )} > - + exif-photo-blog diff --git a/src/site/Footer.tsx b/src/site/Footer.tsx new file mode 100644 index 00000000..1e1ce612 --- /dev/null +++ b/src/site/Footer.tsx @@ -0,0 +1,9 @@ +import { authCached } from '@/cache'; +import FooterClient from './FooterClient'; + +export default async function Footer() { + const session = await authCached(); + return ( + + ); +} diff --git a/src/site/FooterAuth.tsx b/src/site/FooterAuth.tsx deleted file mode 100644 index a4bb2e4a..00000000 --- a/src/site/FooterAuth.tsx +++ /dev/null @@ -1,60 +0,0 @@ -'use client'; - -import { clsx } from 'clsx/lite'; -import Link from 'next/link'; -import { useSession } from 'next-auth/react'; -import ThemeSwitcher from '@/site/ThemeSwitcher'; -import SiteGrid from '../components/SiteGrid'; -import { usePathname } from 'next/navigation'; -import { isPathSignIn } from '@/site/paths'; -import { signOutAction } from '@/auth/action'; -import SubmitButtonWithStatus from '@/components/SubmitButtonWithStatus'; - -const LINK_STYLE = clsx( - 'cursor-pointer', - 'hover:text-gray-300', - 'hover:dark:text-gray-600', -); - -export default function FooterAuth() { - const { data: session, status } = useSession(); - - const path = usePathname(); - - return ( - -
- {status === 'loading' - ? <>Loading ... - : <> - {session?.user?.email &&
- {session.user.email} -
} - {status === 'authenticated' && -
- - Sign Out - -
} - {status === 'unauthenticated' && - - Sign In - } - } -
- {!isPathSignIn(path) && } - } - /> - ); -}; diff --git a/src/site/FooterClient.tsx b/src/site/FooterClient.tsx new file mode 100644 index 00000000..8e5defb9 --- /dev/null +++ b/src/site/FooterClient.tsx @@ -0,0 +1,70 @@ +'use client'; + +import { clsx } from 'clsx/lite'; +import SiteGrid from '../components/SiteGrid'; +import ThemeSwitcher from '@/site/ThemeSwitcher'; +import Link from 'next/link'; +import { SHOW_REPO_LINK } from '@/site/config'; +import RepoLink from '../components/RepoLink'; +import { usePathname } from 'next/navigation'; +import { isPathAdmin, isPathSignIn, pathForAdminPhotos } from './paths'; +import SubmitButtonWithStatus from '@/components/SubmitButtonWithStatus'; +import { signOutAction } from '@/auth/action'; +import Spinner from '@/components/Spinner'; +import AnimateItems from '@/components/AnimateItems'; + +export default function FooterClient({ + userEmail, +}: { + userEmail?: string | null | undefined +}) { + const pathname = usePathname(); + + const showFooter = !isPathSignIn(pathname); + + const shouldAnimate = !isPathAdmin(pathname); + + return ( + +
+ {isPathAdmin(pathname) + ? <> + {userEmail === undefined && + } + {userEmail && <> +
{userEmail}
+
+ + Sign out + +
+ } + + : <> + + Admin + + {SHOW_REPO_LINK && + } + } +
+
+ +
+ ] + : []} + />} + /> + ); +} diff --git a/src/site/FooterStatic.tsx b/src/site/FooterStatic.tsx deleted file mode 100644 index 5e2f6061..00000000 --- a/src/site/FooterStatic.tsx +++ /dev/null @@ -1,47 +0,0 @@ -'use client'; - -import { clsx } from 'clsx/lite'; -import SiteGrid from '../components/SiteGrid'; -import ThemeSwitcher from '@/site/ThemeSwitcher'; -import { signOut } from 'next-auth/react'; -import Link from 'next/link'; -import { SHOW_REPO_LINK } from '@/site/config'; -import RepoLink from '../components/RepoLink'; - -export default function FooterStatic({ - showSignOut, -}: { - showSignOut?: boolean -}) { - return ( - -
- - Admin - - {SHOW_REPO_LINK && - } - {showSignOut && -
signOut()} - > - Sign out -
} -
- - } - /> - ); -} diff --git a/src/site/Nav.tsx b/src/site/Nav.tsx index 577a04fe..684cc5c0 100644 --- a/src/site/Nav.tsx +++ b/src/site/Nav.tsx @@ -1,82 +1,9 @@ -'use client'; - -import { clsx } from 'clsx/lite'; -import { usePathname } from 'next/navigation'; -import Link from 'next/link'; -import SiteGrid from '../components/SiteGrid'; -import { SITE_DOMAIN_OR_TITLE } from '@/site/config'; -import ViewSwitcher, { SwitcherSelection } from '@/site/ViewSwitcher'; -import { - PATH_ADMIN, - PATH_ROOT, - isPathAdmin, - isPathGrid, - isPathProtected, - isPathSets, - isPathSignIn, -} from '@/site/paths'; -import AnimateItems from '../components/AnimateItems'; - -export default function Nav({ showTextLinks }: { showTextLinks?: boolean }) { - const isLoggedIn = false; - - const pathname = usePathname(); - - const showNav = !isPathSignIn(pathname); - - const shouldAnimate = !isPathAdmin(pathname); - - const renderLink = ( - text: string, - linkOrAction: string | (() => void), - ) => - typeof linkOrAction === 'string' - ? {text} - : ; - - const switcherSelectionForPath = (): SwitcherSelection | undefined => { - if (pathname === PATH_ROOT) { - return 'full-frame'; - } else if (isPathGrid(pathname)) { - return 'grid'; - } else if (isPathSets(pathname)) { - return 'sets'; - } else if (isPathProtected(pathname)) { - return 'admin'; - } - }; +import { authCached } from '@/cache'; +import NavClient from './NavClient'; +export default async function Nav() { + const session = await authCached(); return ( - -
- - {showTextLinks && <> - {renderLink('Home', PATH_ROOT)} - {renderLink('Admin', PATH_ADMIN)} - } -
-
- {renderLink(SITE_DOMAIN_OR_TITLE, PATH_ROOT)} -
- ] - : []} - /> - } - /> + ); -}; +} diff --git a/src/site/NavClient.tsx b/src/site/NavClient.tsx new file mode 100644 index 00000000..54493173 --- /dev/null +++ b/src/site/NavClient.tsx @@ -0,0 +1,79 @@ +'use client'; + +import { clsx } from 'clsx/lite'; +import { usePathname } from 'next/navigation'; +import Link from 'next/link'; +import SiteGrid from '../components/SiteGrid'; +import { SITE_DOMAIN_OR_TITLE } from '@/site/config'; +import ViewSwitcher, { SwitcherSelection } from '@/site/ViewSwitcher'; +import { + PATH_ROOT, + isPathAdmin, + isPathGrid, + isPathProtected, + isPathSets, + isPathSignIn, +} from '@/site/paths'; +import AnimateItems from '../components/AnimateItems'; + +export default function NavClient({ + showAdmin, +}: { + showAdmin?: boolean, +}) { + const pathname = usePathname(); + + const showNav = !isPathSignIn(pathname); + + const shouldAnimate = !isPathAdmin(pathname); + + const renderLink = ( + text: string, + linkOrAction: string | (() => void), + ) => + typeof linkOrAction === 'string' + ? {text} + : ; + + const switcherSelectionForPath = (): SwitcherSelection | undefined => { + if (pathname === PATH_ROOT) { + return 'full-frame'; + } else if (isPathGrid(pathname)) { + return 'grid'; + } else if (isPathSets(pathname)) { + return 'sets'; + } else if (isPathProtected(pathname)) { + return 'admin'; + } + }; + + return ( + +
+ +
+
+ {renderLink(SITE_DOMAIN_OR_TITLE, PATH_ROOT)} +
+ ] + : []} + /> + } + /> + ); +}; diff --git a/src/site/ViewSwitcher.tsx b/src/site/ViewSwitcher.tsx index afa35afc..7f7fa149 100644 --- a/src/site/ViewSwitcher.tsx +++ b/src/site/ViewSwitcher.tsx @@ -2,7 +2,7 @@ import Switcher from '@/components/Switcher'; import SwitcherItem from '@/components/SwitcherItem'; import IconFullFrame from '@/site/IconFullFrame'; import IconGrid from '@/site/IconGrid'; -import { PATH_GRID, PATH_SETS } from '@/site/paths'; +import { PATH_ADMIN_PHOTOS, PATH_GRID, PATH_SETS } from '@/site/paths'; import { BiLockAlt } from 'react-icons/bi'; import IconSets from './IconSets'; @@ -38,8 +38,8 @@ export default function ViewSwitcher({ /> {showAdmin && } - href="/admin/photos" + icon={} + href={PATH_ADMIN_PHOTOS} active={currentSelection === 'admin'} />} diff --git a/src/site/globals.css b/src/site/globals.css index 6a71046c..b62a0eb4 100644 --- a/src/site/globals.css +++ b/src/site/globals.css @@ -107,6 +107,11 @@ p-0 min-h-0 border-none active:bg-transparent shadow-none } + a, .link { + @apply + hover:text-gray-600 + hover:dark:text-gray-400 + } /* Common Utilities */ .text-main { @apply