diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..97c5bae --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +FROM node:18-alpine + +RUN npm install -g pnpm + +WORKDIR /app + +COPY package.json pnpm-lock.yaml ./ + +RUN pnpm install --frozen-lockfile + +COPY . . + +RUN pnpm build + +CMD ["pnpm", "start"] diff --git a/capacitor.config.ts b/capacitor.config.ts deleted file mode 100644 index 06b490a..0000000 --- a/capacitor.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { CapacitorConfig } from "@capacitor/cli"; - -const config: CapacitorConfig = { - appId: "bettersplit.shrt.solutions", - appName: "bettersplit", - webDir: "out", -}; - -export default config; diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3cd1ee9 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,39 @@ +services: + nextapp: + build: . + container_name: bettersplit + restart: always + ports: + - "3000:3000" + expose: + - "3000" + labels: + - "traefik.enable=true" + - "traefik.http.routers.bettersplit.rule=Host(`bettersplit.shortman.me`)" + - "traefik.http.routers.bettersplit.entrypoints=websecure" + - "traefik.http.routers.bettersplit.tls.certresolver=myresolver" + networks: + - bettersplit_network + - webproxy + db: + image: postgres:latest + container_name: bettersplit-db + restart: always + shm_size: 128mb + env_file: + - .env.production + volumes: + - pgdata:/var/lib/postgresql/data + ports: + - "5432:5432" + networks: + - bettersplit_network + +volumes: + pgdata: + driver: local +networks: + bettersplit_network: + driver: bridge + webproxy: + external: true diff --git a/public/icon-192x192.png b/public/icon-192x192.png new file mode 100644 index 0000000..f4fb893 Binary files /dev/null and b/public/icon-192x192.png differ diff --git a/public/icon-512x512.png b/public/icon-512x512.png new file mode 100644 index 0000000..dce2069 Binary files /dev/null and b/public/icon-512x512.png differ diff --git a/public/sw.js b/public/sw.js index 535f4b4..72f7e79 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1 +1 @@ -if(!self.define){let e,s={};const t=(t,n)=>(t=new URL(t+".js",n).href,s[t]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=t,e.onload=s,document.head.appendChild(e)}else e=t,importScripts(t),s()})).then((()=>{let e=s[t];if(!e)throw new Error(`Module ${t} didn’t register its module`);return e})));self.define=(n,a)=>{const i=e||("document"in self?document.currentScript.src:"")||location.href;if(s[i])return;let c={};const o=e=>t(e,i),r={module:{uri:i},exports:c,require:o};s[i]=Promise.all(n.map((e=>r[e]||o(e)))).then((e=>(a(...e),c)))}}define(["./workbox-e9849328"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"0820c38a85c862052596b67a14fe8157"},{url:"/_next/static/7ZHts89Qmk_UFK8ov_QqN/_buildManifest.js",revision:"01b09b3e9dda7539be2313c35bd1b563"},{url:"/_next/static/7ZHts89Qmk_UFK8ov_QqN/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/1-af1f1e25dae140be.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/200-1def31964b2356b0.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/23-54b4ab21f3550ebc.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/283-d8ce32dab0aedc01.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/315-7943c6e46aec5d5e.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/323-cfe0cbab1e5ba15a.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/369-b616bc8f00fc0b77.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/427-8d8c459025f4dcb9.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/47edcb22-e33a29a5fce76af4.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/748-db3977eb7f9230bd.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/75-789b1b8b478cf3fd.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/(router)/add/page-54de27b56a2dc618.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/(router)/expense/page-c5772adc1910fa74.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/(router)/friend/page-aeacac438903a352.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/(router)/group/page-ce470f9cffb07e38.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/(router)/layout-4c08d82a2e792b42.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/(router)/page-623140009262c78d.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/_not-found/page-50a202315221fd62.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/api/auth/%5B...nextauth%5D/route-c76daf5c74849c0b.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/api/trpc/%5Btrpc%5D/route-3f6b1acc32fca989.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/layout-8e88f1db16e0189d.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/app/manifest.webmanifest/route-1cba1848fd15aa6a.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/framework-289b5a20f31bf2b1.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/main-094812ef791a00bb.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/main-app-aff18f84bb4c7dff.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/pages/_app-7e5d4a60281b6427.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/pages/_error-77fa64d81664a8ec.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-69c67d16c363604a.js",revision:"7ZHts89Qmk_UFK8ov_QqN"},{url:"/_next/static/css/64d9c3c8374914ad.css",revision:"64d9c3c8374914ad"},{url:"/_next/static/media/569ce4b8f30dc480-s.p.woff2",revision:"ef6cefb32024deac234e82f932a95cbd"},{url:"/_next/static/media/ba015fad6dcf6784-s.woff2",revision:"8ea4f719af3312a055caf09f34c89a77"},{url:"/favicon.ico",revision:"7f98bbc43ba0d1dbf3564adf0821a304"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:t,state:n})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")}),new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")}),new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>!(self.origin===e.origin)),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")})); +if(!self.define){let e,s={};const t=(t,n)=>(t=new URL(t+".js",n).href,s[t]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=t,e.onload=s,document.head.appendChild(e)}else e=t,importScripts(t),s()})).then((()=>{let e=s[t];if(!e)throw new Error(`Module ${t} didn’t register its module`);return e})));self.define=(n,a)=>{const i=e||("document"in self?document.currentScript.src:"")||location.href;if(s[i])return;let c={};const u=e=>t(e,i),r={module:{uri:i},exports:c,require:u};s[i]=Promise.all(n.map((e=>r[e]||u(e)))).then((e=>(a(...e),c)))}}define(["./workbox-e9849328"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"6affb59fb8c2df7b190802cad930aa5b"},{url:"/_next/static/Cm2jYt9uNjK8uPIIvDWBI/_buildManifest.js",revision:"15df7dc5351f5b94edd2b1a20a45d20b"},{url:"/_next/static/Cm2jYt9uNjK8uPIIvDWBI/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/27-b938a8f5be0d2f65.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/323-208a97957e66363a.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/374-85daa37976c80ce0.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/398.da4f45f6283a8297.js",revision:"da4f45f6283a8297"},{url:"/_next/static/chunks/404-bf75935b3eed64c8.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/411-fea7c64a77d7efa3.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/453-b5d952cb4d29e3b4.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/47edcb22-53c213bb67da8598.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/545-7aa7673ff80b6c70.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/579-82307ffc8ffc58ff.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/595-2e6f88d496f5c04d.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/638.37b898530794b952.js",revision:"37b898530794b952"},{url:"/_next/static/chunks/659-e1309d1d4e255fcb.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/660-a91e7856f810ff30.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/748-9d5644ce89f9506a.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/75-eb83b6b9a39598dc.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/846-f2b6981fa389b3bc.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/910-7e83ac56c1b6a3c2.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/app/(router)/add/page-474b4b41b3983355.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/app/(router)/analytics/page-d397853fbaad83f3.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/app/(router)/expense/page-c5e054c19a00b8e2.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/app/(router)/friend/page-317e7086c179127c.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/app/(router)/group/%5Bid%5D/page-141f2237db4e113a.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/app/(router)/group/page-cdaa4a4a507fcb4b.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/app/(router)/layout-e77c9a475f367069.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/app/(router)/page-1799bc7fcb465857.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/app/(router)/sign-in/page-f593adfc0074e628.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/app/_not-found/page-4d03dbbd09ffec58.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/app/api/trpc/%5Btrpc%5D/route-2b30b565f09670de.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/app/api/webhooks/route-f238f351315e1f85.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/app/layout-2d41694e70f603ba.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/app/manifest.webmanifest/route-691c283953c54b58.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/framework-04d66b2debeeab83.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/main-727bb79e63f7e56f.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/main-app-5e13f19d51c2f970.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/pages/_app-bc68a6350feecfd0.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/pages/_error-19bbda1bbbe490f7.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-f93f9518d22d2188.js",revision:"Cm2jYt9uNjK8uPIIvDWBI"},{url:"/_next/static/css/cec5fe637ccb3eea.css",revision:"cec5fe637ccb3eea"},{url:"/_next/static/media/569ce4b8f30dc480-s.p.woff2",revision:"ef6cefb32024deac234e82f932a95cbd"},{url:"/_next/static/media/8d697b304b401681-s.woff2",revision:"cc728f6c0adb04da0dfcb0fc436a8ae5"},{url:"/_next/static/media/ba015fad6dcf6784-s.woff2",revision:"8ea4f719af3312a055caf09f34c89a77"},{url:"/favicon.ico",revision:"7f98bbc43ba0d1dbf3564adf0821a304"},{url:"/icon-192x192.png",revision:"cd37f6d09683174331b06fc5b0f113e7"},{url:"/icon-512x512.png",revision:"b66ee9b60265ffb938f289a64b1fcea9"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:t,state:n})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")}),new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")}),new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>!(self.origin===e.origin)),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")})); diff --git a/src/app.config.ts b/src/app.config.ts index d4d5c76..90bbca3 100644 --- a/src/app.config.ts +++ b/src/app.config.ts @@ -1,10 +1,12 @@ type AppConfig = { name: string; + shortName: string; navigator: Array; }; export const appConfig: AppConfig = { name: "Bettesplit", + shortName: "BS", navigator: [ { name: "Home", diff --git a/src/app/(router)/expense/page.tsx b/src/app/(router)/expense/page.tsx index b1c06b6..40e3252 100644 --- a/src/app/(router)/expense/page.tsx +++ b/src/app/(router)/expense/page.tsx @@ -12,6 +12,7 @@ import React from "react"; export default async function Page() { const splits = await api.expense.getAll(); const sessionUser = await currentUser(); + return ( <>
@@ -20,26 +21,6 @@ export default async function Page() {
- {/* STATS */} - {/*
-
-

Expenses

- {splits.length} -
- -
-

Expenses

- {splits.length} -
- -
-

Balance

- - {getAmount(812.47)} - -
-
*/} - {/* FILTER BAR */}
- ) : null} -
-

{splits[user.id!]}

-
- - - ))} - -

Paid from

-
    - {participants.map((user) => ( -
  • - - {session.user.id !== user.id ? ( - - ) : null} -
    -

    {splits[user.id!]}

    -
    -
    -
  • - ))} -
*/}
); } diff --git a/src/app/_components/expense/paid-by-custom-split.tsx b/src/app/_components/expense/paid-by-custom-split.tsx index 2449049..de70064 100644 --- a/src/app/_components/expense/paid-by-custom-split.tsx +++ b/src/app/_components/expense/paid-by-custom-split.tsx @@ -10,10 +10,8 @@ import { } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { DialogClose } from "@radix-ui/react-dialog"; -import type { PublicUser } from "next-auth"; import Avatar from "@/components/avatar"; import React from "react"; -import { Input } from "@/components/ui/input"; import { NumberInput } from "@/components/number-input"; import { EuroIcon } from "lucide-react"; import { cn } from "@/lib/utils"; diff --git a/src/app/_components/expense/split-to.tsx b/src/app/_components/expense/split-between-input.tsx similarity index 81% rename from src/app/_components/expense/split-to.tsx rename to src/app/_components/expense/split-between-input.tsx index 02516d2..e8756a0 100644 --- a/src/app/_components/expense/split-to.tsx +++ b/src/app/_components/expense/split-between-input.tsx @@ -10,8 +10,11 @@ import { } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { useExpenseStore } from "@/lib/store/expense-store"; -function SplitTo() { + +function SplitBetweenInput() { + const participants = useExpenseStore((state) => state.participants); const splitType = useExpenseStore((state) => state.splitType); + return ( @@ -25,7 +28,7 @@ function SplitTo() { >
- Who paid? + Split between @@ -36,4 +39,4 @@ function SplitTo() { ); } -export default SplitTo; +export default SplitBetweenInput; diff --git a/src/app/_components/group/group-card.tsx b/src/app/_components/group/group-card.tsx index 50b4a77..d4e52cb 100644 --- a/src/app/_components/group/group-card.tsx +++ b/src/app/_components/group/group-card.tsx @@ -23,33 +23,29 @@ function GroupCard({ group }: { group: Group }) { {group.name} -
    - {group?.members?.slice(0, 4)?.map(({ user }, idx) => ( -
  • - -
  • - ))} - {Number(group?.members?.length) > 4 && ( -
  • - +{Number(group?.members?.length) - 4} -
  • - )} -
+
    + {group?.members?.slice(0, 4)?.map(({ user }, idx) => ( +
  • + +
  • + ))} + {Number(group?.members?.length) > 4 && ( +
  • + +{Number(group?.members?.length) - 4} +
  • + )} +

{group.description}

diff --git a/src/app/_components/group/group-page.tsx b/src/app/_components/group/group-page.tsx index c4a4b04..d1bdbaf 100644 --- a/src/app/_components/group/group-page.tsx +++ b/src/app/_components/group/group-page.tsx @@ -13,10 +13,15 @@ import { Button } from "@/components/ui/button"; import { Icons } from "@/components/icons"; import ExpenseCard from "../expense/expense-card"; -function GroupPage({ groupId }: { groupId: string }) { +function GroupPage({ + groupId, + sessionUserId, +}: { + groupId: string; + sessionUserId: string; +}) { const [group] = api.group.get.useSuspenseQuery({ id: groupId }); if (!group) return ; - const groupExpenses = group?.groupBadges?.map(({ expense }) => expense); return ( <> @@ -63,21 +68,12 @@ function GroupPage({ groupId }: { groupId: string }) {
    {groupExpenses.map((expense) => ( - + ))} - {/* {group.members.map((member) => ( -
  • - - - {member.role} - - - -
  • - ))} */}
diff --git a/src/app/manifest.ts b/src/app/manifest.ts index 8d1d85d..7c58665 100644 --- a/src/app/manifest.ts +++ b/src/app/manifest.ts @@ -4,12 +4,12 @@ import type { MetadataRoute } from "next"; export default function manifest(): MetadataRoute.Manifest { return { name: appConfig.name, - short_name: "NextPWA", - description: "A Progressive Web App built with Next.js", + short_name: appConfig.shortName, + description: "Split your expenses with friends", start_url: "/", display: "standalone", - background_color: "#ffffff", - theme_color: "#000000", + background_color: "#000000", + theme_color: "#ffffff", icons: [ { src: "/icon-192x192.png", diff --git a/src/lib/hooks/use-expense-params.tsx b/src/lib/hooks/use-expense-params.tsx new file mode 100644 index 0000000..12e84a0 --- /dev/null +++ b/src/lib/hooks/use-expense-params.tsx @@ -0,0 +1,12 @@ +"use client"; + +import { useSearchParams } from "next/navigation"; +import { useEffect } from "react"; +import { useExpenseStore } from "../store/expense-store"; + +export default function useExpenseParticipantsParams() { + const searchParams = useSearchParams(); + const addParticipants = useExpenseStore((state) => state.addParticipants); + // groupId =nmiqj2qgbmi923rqpgu4ngod; + useEffect(() => {}, []); +}