mirror of
https://github.com/sstent/aicyclingcoach-go.git
synced 2026-04-05 04:23:56 +00:00
1 line
14 KiB
JavaScript
1 line
14 KiB
JavaScript
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[943],{8183:function(e,t,r){"use strict";r(7294);var n=r(2364);t.Z=function(){return(0,n.tZ)("div",{className:"flex justify-center items-center h-screen",children:(0,n.tZ)("div",{className:"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-500"})})}},263:function(e,t,r){"use strict";r.d(t,{a:function(){return i}}),r(4687);var n=r(7294);r(5678),r(3454);var a=(0,n.createContext)(),i=function(){var e=(0,n.useContext)(a);if(!e)throw Error("useAuth must be used within an AuthProvider");return e}},2990:function(e,t,r){"use strict";r.r(t),r.d(t,{default:function(){return O}});var n=r(7812),a=r(29),i=r(4687),l=r.n(i),c=r(7294),o=r(263),s=r(8307),d=r(6835),u=r(8183),m=r(5152),f=r.n(m),p=r(5153),h=r(2364);function g(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function b(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?g(Object(r),!0).forEach(function(t){(0,s.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):g(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var v=f()(function(){return Promise.all([r.e(72),r.e(269),r.e(874)]).then(r.bind(r,2874))},{ssr:!1,loading:function(){return(0,h.tZ)("div",{className:"h-64 bg-gray-100 rounded-md flex items-center justify-center",children:"Loading map..."})},loadableGenerated:{webpack:function(){return[2874]}}}),y=function(e){var t,r,n=e.onUploadSuccess,i=(0,o.a)().apiKey,s=(0,c.useState)(!1),u=s[0],m=s[1],f=(0,c.useState)(null),g=f[0],y=f[1],x=(0,c.useState)(!1),Z=x[0],N=x[1],w=(0,c.useState)(null),X=w[0],k=w[1],O=(t=(0,a.Z)(l().mark(function e(t){var r;return l().wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!("application/gpx+xml"!==t.type)){e.next=3;break}return k("Please upload a valid GPX file"),e.abrupt("return");case 3:try{(r=new FileReader).onload=function(e){try{for(var t,r,n=new DOMParser().parseFromString(e.target.result,"text/xml"),a=(0,p.ng)(n),i=(null===(t=a.features[0])||void 0===t||null===(t=t.properties)||void 0===t?void 0:t.name)||"Unnamed Route",l=0,c=0,o=0,s=0,u=(null===(r=a.features[0])||void 0===r||null===(r=r.geometry)||void 0===r?void 0:r.coordinates)||[],m=1;m<u.length;m++){var f=(0,d.Z)(u[m-1],3),h=f[0],g=f[1],b=f[2],v=(0,d.Z)(u[m],3),x=v[0],Z=v[1],N=v[2],w=111e3*Math.sqrt(Math.pow(x-h,2)+Math.pow(Z-g,2));if(l+=w,b&&N){var X=N-b;X>0?c+=X:o+=Math.abs(X),s=Math.max(s,N)}}var O=l>0?(c/l*100).toFixed(1):"0.0";y({name:i,distance:(l/1e3).toFixed(1)+"km",elevationGain:c.toFixed(0)+"m",elevationLoss:o.toFixed(0)+"m",maxElevation:s.toFixed(0)+"m",avgGrade:O+"%",category:"mixed",gpxContent:e.target.result})}catch(e){k("Error parsing GPX file: "+e.message)}},r.readAsText(t)}catch(e){k("Error parsing GPX file")}case 4:case"end":return e.stop()}},e)})),function(e){return t.apply(this,arguments)}),B=(r=(0,a.Z)(l().mark(function e(){var t,r,a;return l().wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(g){e.next=2;break}return e.abrupt("return");case 2:return N(!0),e.prev=3,t=new FormData,r=new Blob([g.gpxContent],{type:"application/gpx+xml"}),t.append("file",r,g.name+".gpx"),e.next=9,fetch("/api/routes/upload",{method:"POST",headers:{"X-API-Key":i},body:t});case 9:if((a=e.sent).ok){e.next=12;break}throw Error("Upload failed");case 12:return e.next=14,a.json();case 14:n(e.sent),y(null),k(null),e.next=23;break;case 20:e.prev=20,e.t0=e.catch(3),k(e.t0.message||"Upload failed");case 23:return e.prev=23,N(!1),e.finish(23);case 26:case"end":return e.stop()}},e,null,[[3,20,23,26]])})),function(){return r.apply(this,arguments)}),D=(0,c.useCallback)(function(e){e.preventDefault(),m(!0)},[]),C=(0,c.useCallback)(function(e){e.preventDefault(),m(!1)},[]),P=(0,c.useCallback)(function(e){e.preventDefault(),m(!1);var t=e.dataTransfer.files[0];t&&O(t)},[]);return(0,h.BX)("div",{className:"mb-8",children:[(0,h.BX)("div",{className:"border-2 border-dashed rounded-lg p-6 text-center ".concat(u?"border-blue-500 bg-blue-50":"border-gray-300"),onDragOver:D,onDragLeave:C,onDrop:P,children:[(0,h.tZ)("input",{type:"file",id:"gpx-upload",className:"hidden",accept:".gpx,application/gpx+xml",onChange:function(e){return e.target.files[0]&&O(e.target.files[0])}}),(0,h.tZ)("label",{htmlFor:"gpx-upload",className:"cursor-pointer",children:(0,h.BX)("p",{className:"text-gray-600",children:["Drag and drop GPX file here or"," ",(0,h.tZ)("span",{className:"text-blue-600 font-medium",children:"browse files"})]})})]}),g&&(0,h.BX)("div",{className:"mt-6 bg-white p-6 rounded-lg shadow-md",children:[(0,h.tZ)("h3",{className:"text-lg font-medium mb-4",children:"Route Preview"}),(0,h.BX)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[(0,h.BX)("div",{className:"space-y-4",children:[(0,h.BX)("div",{children:[(0,h.tZ)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Route Name"}),(0,h.tZ)("input",{type:"text",value:g.name,onChange:function(e){return y(function(t){return b(b({},t),{},{name:e.target.value})})},className:"w-full p-2 border rounded-md"})]}),(0,h.BX)("div",{className:"grid grid-cols-2 gap-4",children:[(0,h.BX)("div",{children:[(0,h.tZ)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Category"}),(0,h.BX)("select",{value:g.category,onChange:function(e){return y(function(t){return b(b({},t),{},{category:e.target.value})})},className:"w-full p-2 border rounded-md",children:[(0,h.tZ)("option",{value:"climbing",children:"Climbing"}),(0,h.tZ)("option",{value:"flat",children:"Flat"}),(0,h.tZ)("option",{value:"mixed",children:"Mixed"}),(0,h.tZ)("option",{value:"intervals",children:"Intervals"})]})]}),(0,h.BX)("div",{children:[(0,h.tZ)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Distance"}),(0,h.tZ)("p",{className:"p-2 bg-gray-50 rounded-md",children:g.distance})]}),(0,h.BX)("div",{children:[(0,h.tZ)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Elevation Gain"}),(0,h.tZ)("p",{className:"p-2 bg-gray-50 rounded-md",children:g.elevationGain})]}),(0,h.BX)("div",{children:[(0,h.tZ)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Avg Grade"}),(0,h.tZ)("p",{className:"p-2 bg-gray-50 rounded-md",children:g.avgGrade})]}),(0,h.BX)("div",{children:[(0,h.tZ)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Max Elevation"}),(0,h.tZ)("p",{className:"p-2 bg-gray-50 rounded-md",children:g.maxElevation})]}),(0,h.BX)("div",{children:[(0,h.tZ)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Elevation Loss"}),(0,h.tZ)("p",{className:"p-2 bg-gray-50 rounded-md",children:g.elevationLoss})]})]}),(0,h.tZ)("button",{onClick:B,disabled:Z,className:"bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700 disabled:bg-gray-400",children:Z?"Uploading...":"Confirm Upload"})]}),(0,h.tZ)("div",{className:"h-64",children:(0,h.tZ)(v,{gpxData:g.gpxContent})})]})]}),X&&(0,h.tZ)("div",{className:"mt-4 text-red-600 bg-red-50 p-3 rounded-md",children:X})]})},x=r(120),Z=r(1773),N=function(e){var t=e.routes,r=e.onRouteSelect;(0,o.a)().apiKey;var a=(0,c.useState)(""),i=a[0],l=a[1],s=(0,c.useState)("all"),d=s[0],m=s[1],f=(0,c.useState)(!1),p=f[0];f[1];var g=(0,c.useState)(null),b=g[0];g[1];var v=t.filter(function(e){var t=e.name.toLowerCase().includes(i.toLowerCase()),r="all"===d||e.category===d;return t&&r});return(0,h.BX)("div",{className:"bg-white p-6 rounded-lg shadow-md",children:[(0,h.BX)("div",{className:"mb-6 space-y-4",children:[(0,h.tZ)("input",{type:"text",placeholder:"Search routes...",className:"w-full p-2 border rounded-md",value:i,onChange:function(e){return l(e.target.value)}}),(0,h.tZ)("div",{className:"flex flex-wrap gap-2",children:["all","climbing","flat","mixed","intervals"].map(function(e){return(0,h.tZ)("button",{onClick:function(){return m(e)},className:"px-4 py-2 rounded-full text-sm font-medium ".concat(d===e?"bg-blue-600 text-white":"bg-gray-100 text-gray-700 hover:bg-gray-200"),children:e.charAt(0).toUpperCase()+e.slice(1)},e)})})]}),p?(0,h.tZ)(u.Z,{}):b?(0,h.tZ)("div",{className:"text-red-600",children:b}):(0,h.tZ)("div",{className:"space-y-4",children:v.map(function(e){return(0,h.BX)("div",{className:"p-4 border rounded-md hover:bg-gray-50 cursor-pointer",onClick:function(){return r(e)},children:[(0,h.BX)("div",{className:"flex justify-between items-start",children:[(0,h.tZ)("h3",{className:"font-medium text-lg",children:e.name}),(0,h.tZ)("span",{className:"text-sm text-gray-500",children:(0,x.WU)(new Date(e.created_at),"MMM d, yyyy")})]}),(0,h.BX)("div",{className:"grid grid-cols-4 gap-4 mt-2 text-gray-600",children:[(0,h.BX)("div",{children:[(0,h.tZ)("span",{className:"font-medium",children:"Distance: "}),(e.distance/1e3).toFixed(1),"km"]}),(0,h.BX)("div",{children:[(0,h.tZ)("span",{className:"font-medium",children:"Elevation: "}),e.elevation_gain,"m"]}),(0,h.BX)("div",{children:[(0,h.tZ)("span",{className:"font-medium",children:"Category: "}),e.category]}),(0,h.BX)("div",{children:[(0,h.tZ)("span",{className:"font-medium",children:"Grade: "}),e.grade_avg,"%"]}),(0,h.BX)("div",{className:"flex items-center gap-1",children:[(0,h.tZ)("span",{className:"font-medium",children:"Difficulty: "}),(0,n.Z)([,,,,,]).map(function(t,r){return(0,h.tZ)(Z.QJe,{className:"w-4 h-4 ".concat(r<Math.round(e.difficulty_rating/2)?"text-yellow-400":"text-gray-300")},r)})]})]})]},e.id)})})]})};function w(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function X(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?w(Object(r),!0).forEach(function(t){(0,s.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):w(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var k=function(e){var t=e.filters,r=e.onFilterChange,n=function(e,n){r(X(X({},t),{},(0,s.Z)({},e,n)))};return(0,h.BX)("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-4 mb-6 p-4 bg-gray-50 rounded-lg",children:[(0,h.BX)("div",{children:[(0,h.tZ)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Search"}),(0,h.tZ)("input",{type:"text",value:t.searchQuery,onChange:function(e){return n("searchQuery",e.target.value)},placeholder:"Search routes...",className:"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"})]}),(0,h.BX)("div",{children:[(0,h.tZ)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Min Distance (km)"}),(0,h.tZ)("input",{type:"number",value:t.minDistance,onChange:function(e){return n("minDistance",Number(e.target.value))},className:"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"})]}),(0,h.BX)("div",{children:[(0,h.tZ)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Max Distance (km)"}),(0,h.tZ)("input",{type:"number",value:t.maxDistance,onChange:function(e){return n("maxDistance",Number(e.target.value))},className:"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"})]}),(0,h.BX)("div",{children:[(0,h.tZ)("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Difficulty"}),(0,h.BX)("select",{value:t.difficulty,onChange:function(e){return n("difficulty",e.target.value)},className:"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",children:[(0,h.tZ)("option",{value:"all",children:"All Difficulties"}),(0,h.tZ)("option",{value:"easy",children:"Easy"}),(0,h.tZ)("option",{value:"moderate",children:"Moderate"}),(0,h.tZ)("option",{value:"hard",children:"Hard"}),(0,h.tZ)("option",{value:"extreme",children:"Extreme"})]})]})]})},O=function(){var e=(0,o.a)().apiKey,t=(0,c.useState)([]),r=t[0],i=t[1],s=(0,c.useState)(!0),d=s[0],m=s[1],f=(0,c.useState)(null),p=f[0],g=f[1],b=(0,c.useState)({searchQuery:"",minDistance:0,maxDistance:500,difficulty:"all"}),v=b[0],x=b[1];(0,c.useEffect)(function(){var t;(t=(0,a.Z)(l().mark(function t(){var r;return l().wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,fetch("/api/routes",{headers:{"X-API-Key":e}});case 3:if((r=t.sent).ok){t.next=6;break}throw Error("Failed to fetch routes");case 6:return t.next=8,r.json();case 8:i(t.sent.routes),t.next=15;break;case 12:t.prev=12,t.t0=t.catch(0),g(t.t0.message);case 15:return t.prev=15,m(!1),t.finish(15);case 18:case"end":return t.stop()}},t,null,[[0,12,15,18]])})),function(){return t.apply(this,arguments)})()},[e]);var Z=r.filter(function(e){var t=e.name.toLowerCase().includes(v.searchQuery.toLowerCase()),r=e.distance>=v.minDistance&&e.distance<=v.maxDistance,n="all"===v.difficulty||e.difficulty===v.difficulty;return t&&r&&n});return(0,h.BX)("div",{className:"p-6 max-w-7xl mx-auto",children:[(0,h.tZ)("h1",{className:"text-3xl font-bold mb-8",children:"Routes"}),(0,h.BX)("div",{className:"space-y-8",children:[(0,h.BX)("div",{className:"bg-white p-6 rounded-lg shadow-md",children:[(0,h.tZ)(k,{filters:v,onFilterChange:x}),(0,h.tZ)(y,{onUploadSuccess:function(e){i(function(t){return[].concat((0,n.Z)(t),[e])})}})]}),d?(0,h.tZ)(u.Z,{}):p?(0,h.tZ)("div",{className:"text-red-600 bg-red-50 p-4 rounded-md",children:p}):(0,h.tZ)(N,{routes:Z})]})]})}},2930:function(e,t,r){(window.__NEXT_P=window.__NEXT_P||[]).push(["/RoutesPage",function(){return r(2990)}])}},function(e){e.O(0,[365,290,607,120,436,888,774,179],function(){return e(e.s=2930)}),_N_E=e.O()}]); |