diff --git a/go.mod b/go.mod index 53468c09..048b19f8 100644 --- a/go.mod +++ b/go.mod @@ -3,26 +3,17 @@ module github.com/imdotdev/im.dev go 1.14 require ( - 9fans.net/go v0.0.2 // indirect github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef github.com/gin-gonic/gin v1.6.3 github.com/go-stack/stack v1.8.0 github.com/golang/snappy v0.0.2 github.com/gosimple/slug v1.9.0 + github.com/grafana/grafana v5.4.5+incompatible github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac - github.com/karrick/godirwalk v1.16.1 // indirect - github.com/keegancsmith/rpc v1.3.0 // indirect + github.com/lithammer/shortuuid/v3 v3.0.5 github.com/mattn/go-sqlite3 v1.14.6 - github.com/newhook/go-symbols v0.0.0-20151212134530-b75dfefa0d23 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/ramya-rao-a/go-outline v0.0.0-20200117021646-2a048b4510eb // indirect - github.com/rogpeppe/godef v1.1.2 // indirect github.com/spf13/cobra v1.1.1 github.com/spf13/pflag v1.0.5 - github.com/stamblerre/gocode v1.0.0 // indirect - github.com/uudashr/gopkgs v1.3.2 // indirect - golang.org/x/mod v0.4.1 // indirect golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c // indirect - golang.org/x/tools v0.1.0 // indirect gopkg.in/yaml.v2 v2.2.8 ) diff --git a/go.sum b/go.sum index 64467362..f6f2165e 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,3 @@ -9fans.net/go v0.0.0-20181112161441-237454027057 h1:OcHlKWkAMJEF1ndWLGxp5dnJQkYM/YImUOvsBoz6h5E= -9fans.net/go v0.0.0-20181112161441-237454027057/go.mod h1:diCsxrliIURU9xsYtjCp5AbpQKqdhKmf0ujWDUSkfoY= -9fans.net/go v0.0.2 h1:RYM6lWITV8oADrwLfdzxmt8ucfW6UtP9v1jg4qAbqts= -9fans.net/go v0.0.2/go.mod h1:lfPdxjq9v8pVQXUMBCx5EO5oLXWQFlKRQgs1kEkjoIM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -38,6 +34,7 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -52,6 +49,7 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= @@ -84,12 +82,17 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosimple/slug v1.9.0 h1:r5vDcYrFz9BmfIAMC829un9hq7hKM4cHUrsv36LbEqs= github.com/gosimple/slug v1.9.0/go.mod h1:AMZ+sOVe65uByN3kgEyf9WEBKBCSS+dJjMX9x4vDJbg= +github.com/grafana/grafana v1.9.1 h1:4ykSOyQ+qImmZmILEgqsokVnWmvR8/A0zt7jN2RAQxM= +github.com/grafana/grafana v5.4.5+incompatible h1:xNuhSBxLgwDwesuQIAhQu1QCk6tD0TAghKHE36/hxrs= +github.com/grafana/grafana v5.4.5+incompatible/go.mod h1:U8QyUclJHj254BFcuw45p6sg7eeGYX44qn1ShYo5rGE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= @@ -115,28 +118,28 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac h1:n1DqxAo4oWPMvH1+v+DLYlMCecgumhhgnxAPdqDIFHI= github.com/inconshreveable/log15 v0.0.0-20201112154412-8562bdadbbac/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= -github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/keegancsmith/rpc v1.1.0 h1:bXVRk3EzbtrEegTGKxNTc+St1lR7t/Z1PAO8misBnCc= -github.com/keegancsmith/rpc v1.1.0/go.mod h1:Xow74TKX34OPPiPCdz6x1o9c0SCxRqGxDuKGk7ZOo8s= -github.com/keegancsmith/rpc v1.3.0 h1:wGWOpjcNrZaY8GDYZJfvyxmlLljm3YQWF+p918DXtDk= -github.com/keegancsmith/rpc v1.3.0/go.mod h1:6O2xnOGjPyvIPbvp0MdrOe5r6cu1GZ4JoTzpzDhWeo0= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lithammer/shortuuid/v3 v3.0.5 h1:cUCI9JNIWsjVThijRm4K3jInhXZj8+xJxbUGNfm84ms= +github.com/lithammer/shortuuid/v3 v3.0.5/go.mod h1:2QdoCtD4SBzugx2qs3gdR3LXY6McxZYCNEHwDmYvOAE= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -157,20 +160,19 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/newhook/go-symbols v0.0.0-20151212134530-b75dfefa0d23 h1:bXKgb2O/gIrZd/smUeP3OJcAt1ey3UV+cPYT+mRUNzs= -github.com/newhook/go-symbols v0.0.0-20151212134530-b75dfefa0d23/go.mod h1:9RIESfVnNNAkdTKNuEYS0rEkXXM2HYfchPD4xXNx1CU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -184,12 +186,8 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7z github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be h1:ta7tUOvsPHVHGom5hKW5VXNc2xZIkfCKP8iaqOyYtUQ= github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be/go.mod h1:MIDFMn7db1kT65GmV94GzpX9Qdi7N/pQlwb+AN8wh+Q= -github.com/ramya-rao-a/go-outline v0.0.0-20200117021646-2a048b4510eb h1:ilZSL4VaIq4Hsi+lH928xQKnSWymFug6r2gJomUBpW8= -github.com/ramya-rao-a/go-outline v0.0.0-20200117021646-2a048b4510eb/go.mod h1:1WL5IqM+CnRCAbXetRnL1YVoS9KtU2zMhOi/5oAVPo4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/godef v1.1.2 h1:c5mCx0EcCORJOdVMREX7Lgh1raTxAHFmOfXdEB9u8Jw= -github.com/rogpeppe/godef v1.1.2/go.mod h1:WtY9A/ovuQ+UakAJ1/CEqwwulX/WJjb2kgkokCHi/GY= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -208,12 +206,11 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stamblerre/gocode v1.0.0 h1:5aTRgkRTOS8mELHoKatkwhfX44OdEV3iwu3FCXyvLzk= -github.com/stamblerre/gocode v1.0.0/go.mod h1:ONyGamdxpnxaG2+XLyGkNuuoYISmz0QFVHScxvsXsqM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -221,10 +218,7 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/uudashr/gopkgs v1.3.2 h1:ACme7LZyeSNIRIl9HtAA0RsT0eePUsrkHDVb2+aswhg= -github.com/uudashr/gopkgs v1.3.2/go.mod h1:MtCdKVJkxW7hNKWXPNWfpaeEp8+Ml3Q8myb4yWhn2Hg= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -236,8 +230,6 @@ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -256,11 +248,6 @@ golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -275,7 +262,6 @@ golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -284,7 +270,6 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -300,15 +285,11 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -327,17 +308,9 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200226224502-204d844ad48d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -361,6 +334,7 @@ google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiq google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= diff --git a/layouts/nav/editor-nav.tsx b/layouts/nav/editor-nav.tsx index 3960e13f..d8b81117 100644 --- a/layouts/nav/editor-nav.tsx +++ b/layouts/nav/editor-nav.tsx @@ -29,6 +29,7 @@ import { Tag } from "src/types/tag" import { cloneDeep, remove } from "lodash" import { requestApi } from "utils/axios/request" import DarkMode from "components/dark-mode" +import EditModeSelect from "components/edit-mode-select" @@ -56,15 +57,6 @@ function HeaderContent(props: any) { },[props.ar]) - const editOptions = [EditMode.Edit, EditMode.Preview] - const { getRootProps, getRadioProps } = useRadioGroup({ - name: "framework", - defaultValue: EditMode.Edit, - onChange: (v) => { - props.changeEditMode(v) - }, - }) - const group = getRootProps() const addTag = t => { setTags(t) @@ -102,16 +94,7 @@ function HeaderContent(props: any) { - - {editOptions.map((value) => { - const radio = getRadioProps({ value }) - return ( - - {value} - - ) - })} - + @@ -185,8 +168,6 @@ function EditorNav(props) { bg={useColorModeValue('white','gray.800')} left="0" right="0" - borderTop="4px solid" - borderTopColor="teal.400" width="full" > diff --git a/layouts/nav/nav.tsx b/layouts/nav/nav.tsx index baebc059..aaa3a83f 100644 --- a/layouts/nav/nav.tsx +++ b/layouts/nav/nav.tsx @@ -125,8 +125,6 @@ function Header(props) { zIndex="3" left="0" right="0" - borderTop="4px solid" - borderTopColor="teal.400" width="full" bg={useColorModeValue('white', 'gray.800')} {...props} diff --git a/layouts/nav/post-nav.tsx b/layouts/nav/post-nav.tsx index 9a44b273..53d352f4 100644 --- a/layouts/nav/post-nav.tsx +++ b/layouts/nav/post-nav.tsx @@ -110,8 +110,6 @@ function PostNav(props) { zIndex="3" left="0" right="0" - borderTop="4px solid" - borderTopColor="teal.400" width="full" bg={useColorModeValue('white', 'gray.800')} {...props} diff --git a/pages/[username]/[post_slug].tsx b/pages/[username]/[post_id].tsx similarity index 68% rename from pages/[username]/[post_slug].tsx rename to pages/[username]/[post_id].tsx index 1a8756de..8fb3d92c 100644 --- a/pages/[username]/[post_slug].tsx +++ b/pages/[username]/[post_id].tsx @@ -1,10 +1,13 @@ import { Box, chakra, Divider, Flex, Heading, HStack, IconButton, Image, VStack } from "@chakra-ui/react" +import Comments from "components/comments/comments" import Container from "components/container" -import LikeButton from "components/like-button" +import LikeButton from "components/posts/unicorn-like" import { MarkdownRender } from "components/markdown-editor/render" import PostAuthor from "components/posts/post-author" +import TagTextCard from "components/posts/tag-text-card" import SEO from "components/seo" import siteConfig from "configs/site-config" +import useSession from "hooks/use-session" import Nav from "layouts/nav/nav" import PostNav from "layouts/nav/post-nav" import PageContainer from "layouts/page-container" @@ -13,22 +16,34 @@ import { useRouter } from "next/router" import { title } from "process" import React, { useEffect, useState } from "react" import { FaBookmark, FaGithub, FaRegBookmark, FaShare, FaShareAlt } from "react-icons/fa" +import { ReserveUrls } from "src/data/reserve-urls" +import { Comment } from "src/types/comments" import { Post } from "src/types/posts" +import { Tag } from "src/types/tag" import { requestApi } from "utils/axios/request" +import UnicornLike from "components/posts/unicorn-like" const PostPage = () => { const router = useRouter() - const slug = router.query.post_slug + const id = router.query.post_id const [post, setPost]: [Post, any] = useState(null) - + const [comments,setComments]: [Comment[],any] = useState([]) + const session = useSession() useEffect(() => { - if (slug) { - requestApi.get(`/post/${slug}`).then(res => setPost(res.data)) + if (id) { + getData() } - }, [slug]) + }, [id]) + + const getData = async () => { + const res = await requestApi.get(`/post/${id}`) + setPost(res.data) + + getComments(res.data.id) + } const onLike = async () => { - await requestApi.post(`/post/like/${post.id}`) + await requestApi.post(`/story/like/${post.id}`) const p = cloneDeep(post) if (post.liked) { @@ -41,6 +56,12 @@ const PostPage = () => { setPost(p) } + const getComments = async (id) => { + const res = await requestApi.get(`/story/comments/${id}`) + console.log(res.data) + setComments(res.data) + } + return ( <> { {post && <> - + - {post.title} + {post.title} @@ -62,13 +83,16 @@ const PostPage = () => { + {post.rawTags.map(tag => )} + + getComments(post.id)}/> - + {/* */} {/* */} - + {/* */} @@ -92,6 +116,18 @@ const PostPage = () => { icon={} /> + + {post.creatorId === session?.user.id && + router.push(`${ReserveUrls.Editor}/post/${post.id}`)} + icon={} + /> + } @@ -103,7 +139,7 @@ const PostPage = () => { {/* */} - + ar[j].Created.Unix() +} diff --git a/server/pkg/models/post.go b/server/pkg/models/post.go index 779885d1..26fa74f6 100644 --- a/server/pkg/models/post.go +++ b/server/pkg/models/post.go @@ -2,22 +2,30 @@ package models import "time" +const ( + StatusDraft = 1 + StatusPublished = 2 + StatusHidden = 3 +) + type Post struct { - ID int64 `json:"id"` - Creator *UserSimple `json:"creator"` - CreatorID int64 `json:"creatorId"` - Title string `json:"title"` - Slug string `json:"slug"` - Md string `json:"md"` - URL string `json:"url"` - Cover string `json:"cover"` - Brief string `json:"brief"` - Tags []int64 `json:"tags"` - Likes int `json:"likes"` - Liked bool `json:"liked"` - Recommands int `json:"recommands"` - Created time.Time `json:"created"` - Updated time.Time `json:"updated"` + ID string `json:"id"` + Creator *UserSimple `json:"creator"` + CreatorID int64 `json:"creatorId"` + Title string `json:"title"` + Slug string `json:"slug"` + Md string `json:"md"` + URL string `json:"url"` + Cover string `json:"cover"` + Brief string `json:"brief"` + Tags []int64 `json:"tags"` + RawTags []*Tag `json:"rawTags"` + Likes int `json:"likes"` + Liked bool `json:"liked"` + Views int `json:"views"` + Status int `json:"status"` + Created time.Time `json:"created"` + Updated time.Time `json:"updated"` } type Posts []*Post diff --git a/server/pkg/models/story.go b/server/pkg/models/story.go new file mode 100644 index 00000000..1556693b --- /dev/null +++ b/server/pkg/models/story.go @@ -0,0 +1,6 @@ +package models + +const ( + StoryPost = "1" + StoryComment = "2" +) diff --git a/server/pkg/models/user.go b/server/pkg/models/user.go index 6753ccc3..ce8233bf 100644 --- a/server/pkg/models/user.go +++ b/server/pkg/models/user.go @@ -17,7 +17,7 @@ type User struct { Created time.Time `json:"created"` } -const DefaultAvatar = "https://placekitten.com/100/100" +const DefaultAvatar = "https://cdn.hashnode.com/res/hashnode/image/upload/v1600792675173/rY-APy9Fc.png?auto=compress" func (user *User) Query(id int64, username string, email string) error { err := db.Conn.QueryRow(`SELECT id,username,role,nickname,email,avatar,last_seen_at,created FROM user WHERE id=? or username=? or email=?`, diff --git a/server/pkg/utils/id.go b/server/pkg/utils/id.go new file mode 100644 index 00000000..6557f6a7 --- /dev/null +++ b/server/pkg/utils/id.go @@ -0,0 +1,8 @@ +package utils + +import "github.com/lithammer/shortuuid/v3" + +func GenStoryID(storyType string) string { + u := shortuuid.New() + return storyType + u +} diff --git a/src/components/card.tsx b/src/components/card.tsx index cde67f74..c6790521 100644 --- a/src/components/card.tsx +++ b/src/components/card.tsx @@ -9,7 +9,7 @@ export const Card = (props: BoxProps) => { borderRadius=".5rem" borderWidth="1px" p={["0rem",".5rem","1rem"]} - boxShadow="0 1px 2px 0 rgb(0 0 0 / 5%)" + boxShadow="0 1px 1px 0 rgb(0 0 0 / 5%)" {...props} /> ) diff --git a/src/components/comments/comment.tsx b/src/components/comments/comment.tsx new file mode 100644 index 00000000..f3d7c143 --- /dev/null +++ b/src/components/comments/comment.tsx @@ -0,0 +1,111 @@ +import React, { useState } from "react" +import { Avatar, Divider, Flex, Heading, HStack, IconButton, Text, VStack, chakra, Menu, MenuButton, MenuList, MenuItem, Box } from "@chakra-ui/react" +import { Comment } from "src/types/comments" +import Card from "components/card" +import { getUserName } from "utils/user" +import moment from 'moment' +import { MarkdownRender } from "components/markdown-editor/render" +import HeartLike from "components/posts/heart-like" +import { FaRegEdit, FaRegFlag, FaRegTrashAlt, FaReply, FaTrash } from "react-icons/fa" +import { User } from "src/types/session" +import CommentEditor from "./editor" +import { requestApi } from "utils/axios/request" +import Reply from "./reply" + +interface Props { + user: User + comment: Comment + onChange: any +} +export const CommentCard = (props: Props) => { + const { comment, user, onChange} = props + const [editorVisible, setEditorVisible] = useState(false) + + const [replyVisible,setReplyVisible] = useState(false) + const [reply,setReply] = useState('') + const submitReply = async (md) => { + await requestApi.post('/story/comment',{targetID: comment.id, md: md}) + setReplyVisible(false); + } + + const changeComment = async (md) => { + await requestApi.post('/story/comment',{...comment, md}) + setEditorVisible(false) + onChange() + } + + const deleteComment = async id => { + await requestApi.delete(`/comment/${id}`) + onChange() + } + + const likeComment = async (id) => { + await requestApi.post(`/story/like/${id}`) + onChange() + } + + return ( + <>{ + editorVisible ? (user && {setEditorVisible(false);changeComment(md)}} onCancel={() => setEditorVisible(false)} />) : + + + + + + + {getUserName(comment.creator)} + about this user + + + {moment(comment.created).fromNow()} + + + + + + likeComment(comment.id)} /> + + {user && } + onClick={() => setReplyVisible(!replyVisible)} + fontSize="20px" + />} + + + } + _hover={null} + _active={null} + /> + + {user && setEditorVisible(true)}>Edit} + {user && deleteComment(comment.id)}>Delete} + Report + + + + + + {replyVisible && {submitReply(md)}} onCancel={() => setReplyVisible(false)} />} + + {comment.replies.map(reply => + + + + )} + + } + + ) +} + +export default CommentCard diff --git a/src/components/comments/comments.tsx b/src/components/comments/comments.tsx new file mode 100644 index 00000000..e4bb8290 --- /dev/null +++ b/src/components/comments/comments.tsx @@ -0,0 +1,42 @@ +import React, { useState } from "react" +import {Text, Flex, HStack, Button, VStack } from "@chakra-ui/react" +import Card from "components/card" +import useSession from "hooks/use-session" +import { requestApi } from "utils/axios/request" +import CommentCard from "./comment" +import CommentEditor from "./editor" + +interface Props { + storyID: string + comments: any[] + onChange: any +} +export const Comments = ({storyID, comments,onChange }: Props) => { + const [editorVisible,setEditorVisible] = useState(false) + const session = useSession() + const submitComment = async (md) => { + await requestApi.post('/story/comment',{targetID: storyID, md: md}) + setEditorVisible(false) + onChange() + } + + return ( + + + + + Comments ({comments.length}) + + + + + + + {editorVisible && session && submitComment(md)} onCancel={() => setEditorVisible(false)}/>} + + {comments.map(comment => )} + + ) +} + +export default Comments diff --git a/src/components/comments/editor.tsx b/src/components/comments/editor.tsx new file mode 100644 index 00000000..ea331ee2 --- /dev/null +++ b/src/components/comments/editor.tsx @@ -0,0 +1,45 @@ +import React, { useState } from "react" +import { Box, Text, Flex, HStack, useColorModeValue, Button, VStack, Avatar, Heading, propNames } from "@chakra-ui/react" +import Card from "components/card" +import { MarkdownEditor } from "components/markdown-editor/editor" +import useSession from "hooks/use-session" +import { getUserName } from "utils/user" +import EditModeSelect from "components/edit-mode-select" +import { EditMode } from "src/types/editor" +import { MarkdownRender } from "components/markdown-editor/render" +import { Comment } from "src/types/comments" +import { User } from "src/types/session" + +interface Props { + user: User + md: string + onSubmit: any + onCancel: any +} + +export const CommentEditor = (props: Props) => { + const [editMode,setEditMode] = useState(EditMode.Edit) + const [md,setMd] = useState(props.md) + + return ( + + + + + {getUserName(props.user)} + + setEditMode(m)}/> + + + {editMode===EditMode.Edit ? setMd(md)}/> : } + + + + + + + + ) +} + +export default CommentEditor diff --git a/src/components/comments/reply.tsx b/src/components/comments/reply.tsx new file mode 100644 index 00000000..2f554524 --- /dev/null +++ b/src/components/comments/reply.tsx @@ -0,0 +1,105 @@ +import React, { useState } from "react" +import { Avatar, Divider, Flex, Heading, HStack, IconButton, Text, VStack, chakra, Menu, MenuButton, MenuList, MenuItem, Box } from "@chakra-ui/react" +import { Comment } from "src/types/comments" +import Card from "components/card" +import { getUserName } from "utils/user" +import moment from 'moment' +import { MarkdownRender } from "components/markdown-editor/render" +import HeartLike from "components/posts/heart-like" +import { FaRegEdit, FaRegFlag, FaRegTrashAlt, FaReply, FaTrash } from "react-icons/fa" +import { User } from "src/types/session" +import CommentEditor from "./editor" +import { requestApi } from "utils/axios/request" + +interface Props { + user: User + comment: Comment + onChange: any +} +export const Reply = (props: Props) => { + const { comment, user,onChange} = props + const [editorVisible, setEditorVisible] = useState(false) + + const [replyVisible,setReplyVisible] = useState(false) + const [reply,setReply] = useState('') + const submitReply = async (md) => { + await requestApi.post('/story/comment',{targetID: comment.id, md: md}) + setReplyVisible(false); + } + + const changeReply = async (md) => { + await requestApi.post('/story/comment',{...comment, md}) + setEditorVisible(false) + onChange() + } + + const deleteReply = async id => { + await requestApi.delete(`/comment/${id}`) + onChange() + } + + const likeReply = async (id) => { + await requestApi.post(`/story/like/${id}`) + onChange() + } + + + return ( + <>{ + editorVisible ? (user && {setEditorVisible(false);changeReply(md)}} onCancel={() => setEditorVisible(false)} />) : + + + + + + {getUserName(comment.creator)} + + + {moment(comment.created).fromNow()} + + + + + + likeReply(comment.id)} /> + + {user && } + onClick={() => setReplyVisible(!replyVisible)} + fontSize="18px" + />} + + + } + _hover={null} + _active={null} + /> + + {user && setEditorVisible(true)}>Edit} + {user && deleteReply(comment.id)}>Delete} + Report + + + + + + {replyVisible && + + {submitReply(md)}} onCancel={() => setReplyVisible(false)} /> + } + } + + ) +} + +export default Reply diff --git a/src/components/edit-mode-select.tsx b/src/components/edit-mode-select.tsx new file mode 100644 index 00000000..3b8616b4 --- /dev/null +++ b/src/components/edit-mode-select.tsx @@ -0,0 +1,33 @@ +import React from "react" +import { Box, BoxProps, HStack, useRadioGroup } from "@chakra-ui/react" +import { EditMode } from "src/types/editor" +import RadioCard from "./radio-card" + +interface Props { + onChange : any +} +export const EditModeSelect = (props: Props) => { + const editOptions = [EditMode.Edit, EditMode.Preview] + const { getRootProps, getRadioProps } = useRadioGroup({ + name: "framework", + defaultValue: EditMode.Edit, + onChange: (v) => { + props.onChange(v) + }, + }) + const group = getRootProps() + return ( + + {editOptions.map((value) => { + const radio = getRadioProps({ value }) + return ( + + {value} + + ) + })} + + ) +} + +export default EditModeSelect diff --git a/src/components/markdown-editor/render.tsx b/src/components/markdown-editor/render.tsx index 71c3face..224c09b2 100644 --- a/src/components/markdown-editor/render.tsx +++ b/src/components/markdown-editor/render.tsx @@ -9,6 +9,7 @@ import WebsiteLink from 'components/website-link'; type Props = PropsOf & { md: string fontSize?: string + scroll?: boolean } const ChakraMarkdown = chakra(Markdown) @@ -36,6 +37,7 @@ export function MarkdownRender({ md,fontSize, ...rest }:Props) { }, }, }} + maxWidth={["800px","800px","800px","1000px"]} > ); diff --git a/src/components/posts/heart-like.tsx b/src/components/posts/heart-like.tsx new file mode 100644 index 00000000..4f953d41 --- /dev/null +++ b/src/components/posts/heart-like.tsx @@ -0,0 +1,39 @@ +import { chakra, HStack, IconButton, Image, Tooltip, useColorMode, useColorModeValue } from "@chakra-ui/react"; +import { FaHeart, FaRegHeart } from "react-icons/fa"; + +interface Props { + count: number + onClick: any + liked: boolean +} +const UnicornLike = (props: Props) => { + const label = "I like it" + return ( + + + {props.liked? } + onClick={props.onClick} + fontSize="20px" + /> : + } + onClick={props.onClick} + fontSize="20px" + />} + + + {props.count} + + ) +} + +export default UnicornLike \ No newline at end of file diff --git a/src/components/posts/tag-text-card.tsx b/src/components/posts/tag-text-card.tsx index e69de29b..e07775c4 100644 --- a/src/components/posts/tag-text-card.tsx +++ b/src/components/posts/tag-text-card.tsx @@ -0,0 +1,21 @@ +import React from "react" +import {Box, Heading, Image, Text, HStack,Button, Flex,PropsOf,Link} from "@chakra-ui/react" +import { Tag } from "src/types/tag" +import { ReserveUrls } from "src/data/reserve-urls" +import NextLink from "next/link" +import { useRouter } from "next/router" + +interface Props { + tag: Tag +} + + +export const TagTextCard = (props:Props) =>{ + const {tag} = props + const router = useRouter() + return ( + + ) +} + +export default TagTextCard diff --git a/src/components/posts/text-post-card.tsx b/src/components/posts/text-post-card.tsx index ed4d8082..85ac2504 100644 --- a/src/components/posts/text-post-card.tsx +++ b/src/components/posts/text-post-card.tsx @@ -17,7 +17,7 @@ export const TextPostCard= (props:Props) =>{ const gap = moment(post.created).fromNow() return ( - + {post.url ? 外部 : 原创} {post.title} diff --git a/src/components/like-button.tsx b/src/components/posts/unicorn-like.tsx similarity index 56% rename from src/components/like-button.tsx rename to src/components/posts/unicorn-like.tsx index b72c28d8..8240aff5 100644 --- a/src/components/like-button.tsx +++ b/src/components/posts/unicorn-like.tsx @@ -1,25 +1,13 @@ import { chakra, HStack, IconButton, Image, Tooltip, useColorMode, useColorModeValue } from "@chakra-ui/react"; interface Props { - type: string count: number onClick: any liked: boolean } -const LikeButton = (props: Props) => { - let imgSrc: string - let label: string - switch (props.type) { - case "like": - imgSrc = "https://cdn.hashnode.com/res/hashnode/image/upload/v1594643814744/9iXxz71TL.png?auto=compress" - label = "Love it" - break; - case "unicorn": - imgSrc = "https://cdn.hashnode.com/res/hashnode/image/upload/v1594643772437/FYDU5k2kQ.png?auto=compress" - label = "I love it" - default: - break; - } +const UnicornLike = (props: Props) => { + const imgSrc = "https://cdn.hashnode.com/res/hashnode/image/upload/v1594643772437/FYDU5k2kQ.png?auto=compress" + const label = "I love it" return ( @@ -30,7 +18,7 @@ const LikeButton = (props: Props) => { _focus={null} icon={} onClick={props.onClick} - border={props.liked ? `1px solid ${useColorModeValue('gray','pink')}` : null} + border={props.liked ? `1px solid ${useColorModeValue('gray', 'pink')}` : null} /> {props.count} @@ -38,4 +26,4 @@ const LikeButton = (props: Props) => { ) } -export default LikeButton \ No newline at end of file +export default UnicornLike \ No newline at end of file diff --git a/src/types/comments.ts b/src/types/comments.ts new file mode 100644 index 00000000..737f938b --- /dev/null +++ b/src/types/comments.ts @@ -0,0 +1,14 @@ +import { UserSimple } from "./session"; + +export interface Comment { + id: string + targetID: string + creatorID: number + creator?: UserSimple + md: string + liked?: boolean + likes: number + replies: Comment[] + created?: string + updated?: string +} \ No newline at end of file diff --git a/src/types/posts.ts b/src/types/posts.ts index 96d6c110..faff5590 100644 --- a/src/types/posts.ts +++ b/src/types/posts.ts @@ -1,9 +1,10 @@ -import {User} from './session' +import { UserSimple} from './session' +import { Tag } from './tag'; export interface Post { - id?: number + id?: string slug?: string - creator?: User + creator?: UserSimple creatorId?: number title?: string md?: string @@ -12,6 +13,7 @@ export interface Post { brief?: string created?: string tags?: number[] + rawTags?: Tag[] likes? : number liked? : boolean recommands? : number diff --git a/src/types/session.ts b/src/types/session.ts index 5a267f28..cd0a2d1c 100644 --- a/src/types/session.ts +++ b/src/types/session.ts @@ -13,4 +13,11 @@ export interface User { email?: string lastSeenAt?: string created?: string +} + +export interface UserSimple { + id :number + username: string + nickname: string + avatar: string } \ No newline at end of file diff --git a/src/utils/user.ts b/src/utils/user.ts new file mode 100644 index 00000000..640cf64d --- /dev/null +++ b/src/utils/user.ts @@ -0,0 +1,4 @@ +import {User} from 'src/types/session' +export function getUserName(user:User) { + return user.nickname === "" ? user.username : user.nickname +} \ No newline at end of file