diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fd151a5..ce639f6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 0.2.11 +- New: Create custom shortcuts to quickly share images with pre-selected groups - New: Seamless recovery for iOS reinstallations - Improved: Redesigned snackbar notifications - Improved: New backup mechanism to allow larger backup files diff --git a/assets/animated_icons/distorted_face.json b/assets/animated_icons/distorted_face.json new file mode 100644 index 00000000..e7d592d1 --- /dev/null +++ b/assets/animated_icons/distorted_face.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":60,"ip":0,"op":168,"w":1024,"h":1024,"nm":"emoji_u1faea","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null ALL","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.913},"o":{"x":1,"y":0},"t":16,"s":[507.75,502.75,0],"to":[0.667,1.333,0],"ti":[-0.667,-1.5,0]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.441},"t":50,"s":[511.75,510.75,0],"to":[0.667,1.5,0],"ti":[0.667,1.333,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":100,"s":[511.75,511.75,0],"to":[-0.667,-1.333,0],"ti":[0.667,1.5,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.936,"y":0.936},"t":118,"s":[507.75,502.75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.333},"t":136,"s":[507.75,502.75,0],"to":[0,0,0],"ti":[0,0,0]},{"t":144,"s":[507.75,502.75,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.887,0.887,0.634]},"o":{"x":[1,1,0.333],"y":[0,0,0]},"t":16,"s":[92.6,92.6,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.246,0.246,0.539]},"t":50,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[1,1,0.167],"y":[0,0,0]},"t":100,"s":[105,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.936,0.936,0.333],"y":[0,0,0]},"t":118,"s":[91,91,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":136,"s":[93,93,100]},{"t":144,"s":[92.6,92.6,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":168,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Null Face","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[511.454,512.01,0],"ix":2,"l":2},"a":{"a":0,"k":[512,512,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":118,"s":[92.6,92.6,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":136,"s":[94,94,100]},{"t":146,"s":[92.6,92.6,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":168,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"shine left","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[116.81,357.989,0],"ix":2,"l":2},"a":{"a":0,"k":[149.008,369.396,0],"ix":1,"l":2},"s":{"a":0,"k":[107.991,107.991,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"t":16,"s":[{"i":[[-5.883,9.757],[8.261,4.981],[5.883,-9.757],[-8.261,-4.981]],"o":[[5.883,-9.757],[-8.261,-4.981],[-5.883,9.757],[8.261,4.981]],"v":[[15.455,8.925],[11.15,-17.76],[-14.459,-9.111],[-10.154,17.574]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":50,"s":[{"i":[[-6.08,10.48],[11.28,11.28],[14,-19.04],[-15.76,-1.68]],"o":[[8.72,-14.88],[-6.16,-6.16],[-12.72,17.36],[15.12,1.68]],"v":[[-181.004,-10.698],[-177.724,-46.618],[-215.564,-30.938],[-211.164,16.742]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":100,"s":[{"i":[[-6.382,11.001],[14.664,8.084],[14.695,-19.986],[-16.543,-1.763]],"o":[[9.153,-15.619],[-11.258,-6.206],[-15.789,25.084],[15.871,1.763]],"v":[[-198.478,-16.956],[-187.286,-69.411],[-234.755,-38.201],[-231.136,17.347]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.936,"y":0},"t":118,"s":[{"i":[[-5.883,9.757],[8.261,4.981],[5.883,-9.757],[-8.261,-4.981]],"o":[[5.883,-9.757],[-8.261,-4.981],[-5.883,9.757],[8.261,4.981]],"v":[[28.455,21.925],[24.15,-4.76],[-1.459,3.889],[2.846,30.574]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":136,"s":[{"i":[[-5.883,9.757],[8.261,4.981],[5.883,-9.757],[-8.261,-4.981]],"o":[[5.883,-9.757],[-8.261,-4.981],[-5.883,9.757],[8.261,4.981]],"v":[[15.455,8.925],[11.15,-17.76],[-14.459,-9.111],[-10.154,17.574]],"c":true}]},{"t":144,"s":[{"i":[[-5.883,9.757],[8.261,4.981],[5.883,-9.757],[-8.261,-4.981]],"o":[[5.883,-9.757],[-8.261,-4.981],[-5.883,9.757],[8.261,4.981]],"v":[[15.455,8.925],[11.15,-17.76],[-14.459,-9.111],[-10.154,17.574]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.536999990426,0.375999989229,0.141000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[352.044,386.618],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":168,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"eye left","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.81,383.989,0],"ix":2,"l":2},"a":{"a":0,"k":[199.938,393.472,0],"ix":1,"l":2},"s":{"a":0,"k":[107.991,107.991,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"t":16,"s":[{"i":[[0.844,-22.972],[37.984,-0.548],[-0.099,34.288],[-38.391,-1.235],[-9.099,-7.403]],"o":[[-1.234,33.593],[-39.975,-1.225],[0.103,-35.532],[14.321,0.461],[17.054,13.875]],"v":[[60.251,3.381],[0.971,70.183],[-58.381,0.378],[0.971,-69.427],[36.081,-56.873]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":50,"s":[{"i":[[19.6,-38.48],[33.12,5.12],[-3.12,49.04],[-43.44,5.92],[-11.84,-31.84]],"o":[[-19.6,38.48],[-32.72,-5.12],[3.2,-49.2],[28.64,-3.92],[5.36,14.4]],"v":[[-123.315,25.142],[-206.115,80.742],[-258.435,-3.978],[-179.395,-102.698],[-115.315,-63.098]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":100,"s":[{"i":[[19.723,-42.25],[33.328,5.622],[-3.14,53.844],[-43.709,6.528],[-11.925,-34.956]],"o":[[-19.723,42.25],[-32.926,-5.622],[3.22,-54.02],[28.82,-4.304],[5.394,15.811]],"v":[[-146.258,23.56],[-229.578,84.607],[-282.227,-8.412],[-202.69,-116.803],[-138.208,-73.324]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.936,"y":0},"t":118,"s":[{"i":[[0.844,-22.972],[37.984,-0.548],[-0.099,34.288],[-38.391,-1.235],[-9.099,-7.403]],"o":[[-1.234,33.593],[-39.975,-1.225],[0.103,-35.532],[14.321,0.461],[17.054,13.875]],"v":[[73.251,15.381],[13.971,82.183],[-45.381,12.378],[13.971,-57.427],[49.081,-44.873]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":136,"s":[{"i":[[0.844,-22.972],[37.984,-0.548],[-0.099,34.288],[-38.391,-1.235],[-9.099,-7.403]],"o":[[-1.234,33.593],[-39.975,-1.225],[0.103,-35.532],[14.321,0.461],[17.054,13.875]],"v":[[60.251,3.381],[0.971,70.183],[-58.381,0.378],[0.971,-69.427],[36.081,-56.873]],"c":true}]},{"t":144,"s":[{"i":[[0.844,-22.972],[37.984,-0.548],[-0.099,34.288],[-38.391,-1.235],[-9.099,-7.403]],"o":[[-1.234,33.593],[-39.975,-1.225],[0.103,-35.532],[14.321,0.461],[17.054,13.875]],"v":[[60.251,3.381],[0.971,70.183],[-58.381,0.378],[0.971,-69.427],[36.081,-56.873]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.169000004787,0.051000000449,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[366.035,410.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":168,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"shine right","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[834.207,359.19,0],"ix":2,"l":2},"a":{"a":0,"k":[813.792,370.554,0],"ix":1,"l":2},"s":{"a":0,"k":[107.991,107.991,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"t":16,"s":[{"i":[[6.227,-9.542],[8.078,5.272],[-6.227,9.541],[-8.077,-5.272]],"o":[[-6.227,9.541],[-8.078,-5.272],[6.227,-9.542],[8.078,5.272]],"v":[[14.627,9.546],[-11.274,17.276],[-14.627,-9.545],[11.274,-17.276]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":50,"s":[{"i":[[-1.12,-15.12],[14.96,-1.68],[-4,20.96],[-9.6,-2.16]],"o":[[1.04,14.24],[-17.6,1.92],[4.4,-23.12],[17.28,3.84]],"v":[[202.293,-15.017],[185.413,18.503],[159.893,-24.777],[190.453,-54.137]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":100,"s":[{"i":[[-2.68,-17.086],[13.925,-3.242],[-1.52,24.18],[-9.284,-1.6]],"o":[[2.51,16.093],[-16.388,3.751],[1.665,-26.671],[16.705,2.825]],"v":[[225.056,-29.984],[212.782,18.945],[184.03,-37.299],[212.959,-86.104]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.936,"y":0},"t":118,"s":[{"i":[[6.227,-9.542],[8.078,5.272],[-6.227,9.541],[-8.077,-5.272]],"o":[[-6.227,9.541],[-8.078,-5.272],[6.227,-9.542],[8.078,5.272]],"v":[[3.627,22.546],[-22.274,30.276],[-25.627,3.455],[0.274,-4.276]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":136,"s":[{"i":[[6.227,-9.542],[8.078,5.272],[-6.227,9.541],[-8.077,-5.272]],"o":[[-6.227,9.541],[-8.078,-5.272],[6.227,-9.542],[8.078,5.272]],"v":[[14.627,9.546],[-11.274,17.276],[-14.627,-9.545],[11.274,-17.276]],"c":true}]},{"t":144,"s":[{"i":[[6.227,-9.542],[8.078,5.272],[-6.227,9.541],[-8.077,-5.272]],"o":[[-6.227,9.541],[-8.078,-5.272],[6.227,-9.542],[8.078,5.272]],"v":[[14.627,9.546],[-11.274,17.276],[-14.627,-9.545],[11.274,-17.276]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.536999990426,0.375999989229,0.141000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[636.907,386.618],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":168,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"eye right","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[508.27,511.989,0],"ix":2,"l":2},"a":{"a":0,"k":[512,512,0],"ix":1,"l":2},"s":{"a":0,"k":[107.991,107.991,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"t":16,"s":[{"i":[[1.293,-35.229],[37.984,-0.548],[-0.1,34.287],[-13.751,13.431],[-16.083,0.202]],"o":[[-1.234,33.593],[-39.975,-1.225],[0.059,-20.421],[9.588,-9.364],[41.162,1.324]],"v":[[58.719,3.004],[-0.56,69.805],[-59.913,0.001],[-39.099,-54.27],[-0.56,-69.805]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":50,"s":[{"i":[[-3.2,-49.2],[32.72,-5.04],[19.6,38.56],[-5.36,14.32],[-28.64,-3.92]],"o":[[3.12,49.04],[-33.12,5.12],[-19.6,-38.56],[11.84,-31.84],[43.44,5.92]],"v":[[272.37,-3.977],[220.05,80.743],[137.25,25.143],[129.25,-63.097],[193.33,-102.697]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":100,"s":[{"i":[[-8.302,-55.637],[30.309,-8.645],[22.622,42.082],[-3.515,16.755],[-27.425,-1.903]],"o":[[8.21,55.462],[-30.677,8.77],[-22.622,-42.082],[7.744,-37.245],[41.593,2.858]],"v":[[292.976,-22.813],[252.746,78.145],[168.705,22.326],[151.683,-77.258],[207.848,-127.979]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.936,"y":0},"t":118,"s":[{"i":[[1.293,-35.229],[37.984,-0.548],[-0.1,34.287],[-13.751,13.431],[-16.083,0.202]],"o":[[-1.234,33.593],[-39.975,-1.225],[0.059,-20.421],[9.588,-9.364],[41.162,1.324]],"v":[[47.719,15.004],[-11.56,81.805],[-70.913,12.001],[-50.099,-42.27],[-11.56,-57.805]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":136,"s":[{"i":[[1.293,-35.229],[37.984,-0.548],[-0.1,34.287],[-13.751,13.431],[-16.083,0.202]],"o":[[-1.234,33.593],[-39.975,-1.225],[0.059,-20.421],[9.588,-9.364],[41.162,1.324]],"v":[[58.719,3.004],[-0.56,69.805],[-59.913,0.001],[-39.099,-54.27],[-0.56,-69.805]],"c":true}]},{"t":144,"s":[{"i":[[1.293,-35.229],[37.984,-0.548],[-0.1,34.287],[-13.751,13.431],[-16.083,0.202]],"o":[[-1.234,33.593],[-39.975,-1.225],[0.059,-20.421],[9.588,-9.364],[41.162,1.324]],"v":[[58.719,3.004],[-0.56,69.805],[-59.913,0.001],[-39.099,-54.27],[-0.56,-69.805]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.169000004787,0.051000000449,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[652.03,410.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":168,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"mouth","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":22,"s":[509.35,511.989,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[509.35,546.546,0],"to":[0,0,0],"ti":[0,0,0]},{"t":50,"s":[509.35,511.989,0]}],"ix":2,"l":2},"a":{"a":0,"k":[512,512,0],"ix":1,"l":2},"s":{"a":0,"k":[107.991,107.991,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"t":16,"s":[{"i":[[-64.094,0],[-35.811,20.627],[-3.378,-7.206],[3.486,-3.932],[69.99,0],[45.029,50.01],[-2.152,4.749],[-6.618,-3.804]],"o":[[64.041,0],[7,-4.032],[2.225,4.749],[-44.811,50.541],[-67.284,0.519],[-3.413,-3.932],[3.549,-7.834],[35.757,20.553]],"v":[[-0.519,-1.249],[160.087,-47.326],[179.078,-41.167],[177.001,-26.922],[-0.519,50.839],[-177.074,-26.922],[-179.151,-41.167],[-160.161,-47.326]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[-51.075,-0.008],[-34.178,12.673],[-0.904,-13.025],[10.471,-3.743],[49.496,0.006],[44.735,16.547],[-0.149,11.611],[-15.508,-2.7]],"o":[[51.044,0.008],[15.766,-2.835],[0.225,11.611],[-46.608,16.659],[-47.697,-0.006],[-10.436,-3.86],[0.972,-13.395],[34.13,12.629]],"v":[[2.516,49.284],[136.851,21.378],[166.98,40.825],[144.344,66.831],[0.077,100.479],[-138.621,67.048],[-161.29,40.792],[-131.227,21.345]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[-41.753,-0.014],[-33.009,6.976],[0.868,-17.193],[16.349,-5.332],[42.028,0.007],[37.157,12.349],[1.286,16.526],[-21.874,-1.91]],"o":[[41.737,0.014],[22.043,-1.977],[-1.208,16.526],[-36.976,12.058],[-41.231,0.146],[-15.397,-5.117],[-0.874,-17.378],[32.965,6.954]],"v":[[4.689,85.47],[120.211,70.577],[158.316,99.541],[118.958,132.894],[3.545,150.013],[-112.585,132.337],[-148.499,99.484],[-110.508,70.521]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":50,"s":[{"i":[[-32.43,-0.02],[-31.84,1.28],[2.64,-21.36],[26.16,-1.28],[30.36,0.01],[29.84,1.44],[2.72,21.44],[-28.24,-1.12]],"o":[[32.43,0.02],[28.32,-1.12],[-2.64,21.44],[0,0],[-30.36,-0.01],[-26.24,-1.28],[-2.72,-21.36],[31.8,1.28]],"v":[[6.862,121.657],[103.572,119.777],[149.652,158.257],[97.572,197.457],[7.012,199.547],[-83.548,197.377],[-135.708,158.177],[-89.788,119.697]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":100,"s":[{"i":[[-35.621,-0.069],[-34.224,5.539],[0.581,-29.504],[29.748,-4.705],[38.643,0.482],[31.109,4.857],[0.53,28.798],[-29.253,-4.457]],"o":[[35.706,0.069],[29.411,-4.76],[-0.581,29.504],[-33.134,5.678],[-32.94,-0.411],[-29.725,-4.641],[-0.53,-28.798],[34.015,5.183]],"v":[[6.932,148.388],[112.602,140.3],[168.383,177.604],[112.88,228.658],[-1.256,236.583],[-98.087,228.656],[-153.749,178.092],[-98.291,140.393]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.936,"y":0},"t":118,"s":[{"i":[[-64.094,0],[-35.811,20.627],[-3.378,-7.206],[3.486,-3.932],[69.99,0],[45.029,50.01],[-2.152,4.749],[-6.618,-3.804]],"o":[[64.041,0],[7,-4.032],[2.225,4.749],[-44.811,50.541],[-67.284,0.519],[-3.413,-3.932],[3.549,-7.834],[35.757,20.553]],"v":[[-1.019,-14.249],[147.587,-59.326],[166.578,-53.167],[164.501,-38.922],[-1.519,36.339],[-165.074,-38.922],[-167.151,-53.167],[-148.161,-59.326]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":136,"s":[{"i":[[-64.094,0],[-35.811,20.627],[-3.378,-7.206],[3.486,-3.932],[69.99,0],[45.029,50.01],[-2.152,4.749],[-6.618,-3.804]],"o":[[64.041,0],[7,-4.032],[2.225,4.749],[-44.811,50.541],[-67.284,0.519],[-3.413,-3.932],[3.549,-7.834],[35.757,20.553]],"v":[[-0.519,-1.249],[160.087,-47.326],[179.078,-41.167],[177.001,-26.922],[-0.519,50.839],[-177.074,-26.922],[-179.151,-41.167],[-160.161,-47.326]],"c":true}]},{"t":144,"s":[{"i":[[-64.094,0],[-35.811,20.627],[-3.378,-7.206],[3.486,-3.932],[69.99,0],[45.029,50.01],[-2.152,4.749],[-6.618,-3.804]],"o":[[64.041,0],[7,-4.032],[2.225,4.749],[-44.811,50.541],[-67.284,0.519],[-3.413,-3.932],[3.549,-7.834],[35.757,20.553]],"v":[[-0.519,-1.249],[160.087,-47.326],[179.078,-41.167],[177.001,-26.922],[-0.519,50.839],[-177.074,-26.922],[-179.151,-41.167],[-160.161,-47.326]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.169000004787,0.051000000449,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[508.068,665.343],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":168,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"eye left 2","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[509.35,511.989,0],"ix":2,"l":2},"a":{"a":0,"k":[512,512,0],"ix":1,"l":2},"s":{"a":0,"k":[107.991,107.991,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"t":20,"s":[{"i":[[-38.08,-1.235],[1.283,-35.229],[37.66,-0.548],[-0.098,34.287]],"o":[[40.81,1.324],[-1.223,33.593],[-39.634,-1.225],[0.102,-35.551]],"v":[[0.409,-69.187],[59.183,3.621],[0.409,70.422],[-58.436,0.618]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":50,"s":[{"i":[[-93.84,16.08],[28.08,-147.76],[105.12,28.48],[-15.12,96.88]],"o":[[93.84,-16],[-28.08,147.76],[-88.48,-24],[12.16,-99.2]],"v":[[-138.835,-207.429],[19.965,5.451],[-207.475,208.571],[-314.275,-1.429]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":100,"s":[{"i":[[-98.501,16.879],[29.475,-155.099],[110.341,29.895],[-15.871,101.692]],"o":[[98.501,-16.795],[-29.475,155.099],[-92.875,-25.192],[12.764,-104.127]],"v":[[-156.75,-234.822],[-6.063,2.631],[-230.799,229.84],[-334.904,-6.591]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.936,"y":0},"t":118,"s":[{"i":[[-38.08,-1.235],[1.283,-35.229],[37.66,-0.548],[-0.098,34.287]],"o":[[40.81,1.324],[-1.223,33.593],[-39.634,-1.225],[0.102,-35.551]],"v":[[0.409,-69.187],[59.183,3.621],[0.409,70.422],[-58.436,0.618]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":136,"s":[{"i":[[-38.08,-1.235],[1.283,-35.229],[37.66,-0.548],[-0.098,34.287]],"o":[[40.81,1.324],[-1.223,33.593],[-39.634,-1.225],[0.102,-35.551]],"v":[[0.409,-69.187],[59.183,3.621],[0.409,70.422],[-58.436,0.618]],"c":true}]},{"t":144,"s":[{"i":[[-38.08,-1.235],[1.283,-35.229],[37.66,-0.548],[-0.098,34.287]],"o":[[40.81,1.324],[-1.223,33.593],[-39.634,-1.225],[0.102,-35.551]],"v":[[0.409,-69.187],[59.183,3.621],[0.409,70.422],[-58.436,0.618]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0.72,1,1,1,0.805,0.925,0.925,0.925,0.89,0.851,0.851,0.851,0.945,0.796,0.796,0.796,1,0.741,0.741,0.741],"ix":9}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[-70.438,22.25],"to":[-5.333,-0.333],"ti":[7.333,0.667]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":50,"s":[-102.438,20.25],"to":[-7.333,-0.667],"ti":[2,0.333]},{"t":100,"s":[-114.438,18.25]}],"ix":5},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[40,196],"to":[9.667,-5],"ti":[-10,-0.333]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":50,"s":[98,166],"to":[10,0.333],"ti":[-0.333,-5.333]},{"t":100,"s":[100,198]}],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[366.035,409.52],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":36,"op":116,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"eye right 2","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[509.35,511.989,0],"ix":2,"l":2},"a":{"a":0,"k":[512,512,0],"ix":1,"l":2},"s":{"a":0,"k":[107.991,107.991,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"t":20,"s":[{"i":[[-1.365,-36.287],[33.601,0.184],[0.703,35.21],[-37.03,0.178]],"o":[[-0.365,35.713],[-37.701,-0.207],[-0.915,-45.839],[34.901,-0.167]],"v":[[58.968,2.767],[0.804,70.187],[-58.6,4.77],[1.133,-68.198]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":50,"s":[{"i":[[-12.16,-99.2],[88.48,-24],[28.08,147.84],[-93.84,-16]],"o":[[15.12,96.96],[-105.12,28.48],[-28.08,-147.84],[93.84,16]],"v":[[324.393,-1.429],[217.593,208.571],[-9.847,5.451],[148.953,-207.429]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":100,"s":[{"i":[[-22.121,-111.67],[80.846,-35.163],[42.357,165.537],[-90.197,-9.824]],"o":[[24.672,108.86],[-96.054,41.738],[-42.357,-165.537],[90.197,9.824]],"v":[[341.061,-24.658],[262.923,223.551],[26.66,12.946],[153.518,-243.171]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.936,"y":0},"t":118,"s":[{"i":[[-1.365,-36.287],[33.601,0.184],[0.703,35.21],[-37.03,0.178]],"o":[[-0.365,35.713],[-37.701,-0.207],[-0.915,-45.839],[34.901,-0.167]],"v":[[58.968,2.767],[0.804,70.187],[-58.6,4.77],[1.133,-68.198]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":136,"s":[{"i":[[-1.365,-36.287],[33.601,0.184],[0.703,35.21],[-37.03,0.178]],"o":[[-0.365,35.713],[-37.701,-0.207],[-0.915,-45.839],[34.901,-0.167]],"v":[[58.968,2.767],[0.804,70.187],[-58.6,4.77],[1.133,-68.198]],"c":true}]},{"t":144,"s":[{"i":[[-1.365,-36.287],[33.601,0.184],[0.703,35.21],[-37.03,0.178]],"o":[[-0.365,35.713],[-37.701,-0.207],[-0.915,-45.839],[34.901,-0.167]],"v":[[58.968,2.767],[0.804,70.187],[-58.6,4.77],[1.133,-68.198]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0.72,1,1,1,0.805,0.925,0.925,0.925,0.89,0.851,0.851,0.851,0.945,0.796,0.796,0.796,1,0.741,0.741,0.741],"ix":9}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[70.438,22.25],"to":[5.333,-0.333],"ti":[-7.333,0.667]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":50,"s":[102.438,20.25],"to":[7.333,-0.667],"ti":[-2,0.333]},{"t":100,"s":[114.438,18.25]}],"ix":5},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[-40,196],"to":[-9.667,-5],"ti":[10,-0.333]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":50,"s":[-98,166],"to":[-10,0.333],"ti":[0.333,-5.333]},{"t":100,"s":[-100,198]}],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[650.897,409.52],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":36,"op":116,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"base matte","parent":12,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2,-3,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[15.4,0],[0,38.4],[-27.9,0],[-10.6,-9.3],[0,-16.9],[11.5,-10.2]],"o":[[-27.9,0],[0,-38.4],[15.5,0],[11.5,10.2],[0,16.9],[-10.6,9.3]],"v":[[0,55.9],[-58,0],[0,-55.9],[40.4,-41.5],[58,0],[40.4,41.4]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0.48,0.992,0.878,0.188,0.691,0.98,0.816,0.178,0.902,0.969,0.753,0.169,0.966,0.963,0.694,0.153,1,0.957,0.635,0.137],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[56.225,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":168,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"base shadow","parent":12,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[15.4,0],[0,38.4],[-27.9,0],[-10.6,-9.3],[0,-16.9],[11.5,-10.2]],"o":[[-27.9,0],[0,-38.4],[15.5,0],[11.5,10.2],[0,16.9],[-10.6,9.3]],"v":[[0,55.9],[-58,0],[0,-55.9],[40.4,-41.5],[58,0],[40.4,41.4]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.560784313725,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":168,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"base normal","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[800,800,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[15.4,0],[0,38.4],[-27.9,0],[-10.6,-9.3],[0,-16.9],[11.5,-10.2]],"o":[[-27.9,0],[0,-38.4],[15.5,0],[11.5,10.2],[0,16.9],[-10.6,9.3]],"v":[[0,55.9],[-58,0],[0,-55.9],[40.4,-41.5],[58,0],[40.4,41.4]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0.48,0.992,0.878,0.188,0.691,0.98,0.816,0.178,0.902,0.969,0.753,0.169,0.966,0.963,0.694,0.153,1,0.957,0.635,0.137],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[56.225,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":168,"st":0,"bm":0}],"markers":[{"tm":52,"cm":"rest","dr":0}]} \ No newline at end of file diff --git a/lib/src/database/daos/shortcuts.dao.dart b/lib/src/database/daos/shortcuts.dao.dart new file mode 100644 index 00000000..60352143 --- /dev/null +++ b/lib/src/database/daos/shortcuts.dao.dart @@ -0,0 +1,83 @@ +import 'package:drift/drift.dart'; +import 'package:twonly/src/database/tables/shortcuts.table.dart'; +import 'package:twonly/src/database/twonly.db.dart'; + +part 'shortcuts.dao.g.dart'; + +@DriftAccessor( + tables: [ + Shortcuts, + ShortcutMembers, + ], +) +class ShortcutsDao extends DatabaseAccessor with _$ShortcutsDaoMixin { + ShortcutsDao(super.db); + + Stream> watchAllShortcuts() { + return (select(shortcuts)..orderBy([ + (t) => + OrderingTerm(expression: t.usageCounter, mode: OrderingMode.desc), + ])) + .watch(); + } + + Future getShortcutByEmoji(String emoji) { + return (select( + shortcuts, + )..where((t) => t.emoji.equals(emoji))).getSingleOrNull(); + } + + Future createShortcut(String emoji) async { + try { + await into(shortcuts).insert( + ShortcutsCompanion.insert(emoji: emoji), + ); + // ignore: empty_catches + } catch (e) {} + } + + Future addShortcutMembers(int shortcutId, List groupIds) async { + await batch((b) { + b.insertAll( + shortcutMembers, + groupIds.map( + (gId) => ShortcutMembersCompanion.insert( + shortcutId: shortcutId, + groupId: gId, + ), + ), + ); + }); + } + + Future> getShortcutMembers(int shortcutId) { + return (select( + shortcutMembers, + )..where((t) => t.shortcutId.equals(shortcutId))).get(); + } + + Future incrementUsage(int shortcutId) async { + await customStatement( + 'UPDATE shortcuts SET usage_counter = usage_counter + 1 WHERE id = ?', + [shortcutId], + ); + // Notify updates to trigger streams + notifyUpdates({TableUpdate.onTable(shortcuts, kind: UpdateKind.update)}); + } + + Future updateShortcut(int shortcutId, String emoji) async { + await (update(shortcuts)..where((t) => t.id.equals(shortcutId))).write( + ShortcutsCompanion(emoji: Value(emoji)), + ); + } + + Future deleteShortcutMembers(int shortcutId) async { + await (delete( + shortcutMembers, + )..where((t) => t.shortcutId.equals(shortcutId))).go(); + } + + Future deleteShortcut(int shortcutId) async { + await (delete(shortcuts)..where((t) => t.id.equals(shortcutId))).go(); + } +} diff --git a/lib/src/database/daos/shortcuts.dao.g.dart b/lib/src/database/daos/shortcuts.dao.g.dart new file mode 100644 index 00000000..36e0a8d5 --- /dev/null +++ b/lib/src/database/daos/shortcuts.dao.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'shortcuts.dao.dart'; + +// ignore_for_file: type=lint +mixin _$ShortcutsDaoMixin on DatabaseAccessor { + $ShortcutsTable get shortcuts => attachedDatabase.shortcuts; + $GroupsTable get groups => attachedDatabase.groups; + $ShortcutMembersTable get shortcutMembers => attachedDatabase.shortcutMembers; + ShortcutsDaoManager get managers => ShortcutsDaoManager(this); +} + +class ShortcutsDaoManager { + final _$ShortcutsDaoMixin _db; + ShortcutsDaoManager(this._db); + $$ShortcutsTableTableManager get shortcuts => + $$ShortcutsTableTableManager(_db.attachedDatabase, _db.shortcuts); + $$GroupsTableTableManager get groups => + $$GroupsTableTableManager(_db.attachedDatabase, _db.groups); + $$ShortcutMembersTableTableManager get shortcutMembers => + $$ShortcutMembersTableTableManager( + _db.attachedDatabase, + _db.shortcutMembers, + ); +} diff --git a/lib/src/database/schemas/twonly_db/drift_schema_v13.json b/lib/src/database/schemas/twonly_db/drift_schema_v13.json new file mode 100644 index 00000000..c2309348 --- /dev/null +++ b/lib/src/database/schemas/twonly_db/drift_schema_v13.json @@ -0,0 +1,2901 @@ +{ + "_meta": { + "description": "This file contains a serialized version of schema entities for drift.", + "version": "1.3.0" + }, + "options": { + "store_date_time_values_as_text": false + }, + "entities": [ + { + "id": 0, + "references": [], + "type": "table", + "data": { + "name": "contacts", + "was_declared_in_moor": false, + "columns": [ + { + "name": "user_id", + "getter_name": "userId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "username", + "getter_name": "username", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "display_name", + "getter_name": "displayName", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "nick_name", + "getter_name": "nickName", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "avatar_svg_compressed", + "getter_name": "avatarSvgCompressed", + "moor_type": "blob", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "sender_profile_counter", + "getter_name": "senderProfileCounter", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "accepted", + "getter_name": "accepted", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"accepted\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"accepted\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "deleted_by_user", + "getter_name": "deletedByUser", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"deleted_by_user\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"deleted_by_user\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "requested", + "getter_name": "requested", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"requested\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"requested\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "blocked", + "getter_name": "blocked", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"blocked\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"blocked\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "verified", + "getter_name": "verified", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"verified\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"verified\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "account_deleted", + "getter_name": "accountDeleted", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"account_deleted\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"account_deleted\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "created_at", + "getter_name": "createdAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "user_discovery_version", + "getter_name": "userDiscoveryVersion", + "moor_type": "blob", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "user_discovery_excluded", + "getter_name": "userDiscoveryExcluded", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"user_discovery_excluded\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"user_discovery_excluded\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "user_discovery_manual_approved", + "getter_name": "userDiscoveryManualApproved", + "moor_type": "bool", + "nullable": true, + "customConstraints": null, + "defaultConstraints": "CHECK (\"user_discovery_manual_approved\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"user_discovery_manual_approved\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "media_send_counter", + "getter_name": "mediaSendCounter", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "media_received_counter", + "getter_name": "mediaReceivedCounter", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "user_id" + ] + } + }, + { + "id": 1, + "references": [], + "type": "table", + "data": { + "name": "groups", + "was_declared_in_moor": false, + "columns": [ + { + "name": "group_id", + "getter_name": "groupId", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "is_group_admin", + "getter_name": "isGroupAdmin", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"is_group_admin\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"is_group_admin\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "is_direct_chat", + "getter_name": "isDirectChat", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"is_direct_chat\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"is_direct_chat\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "pinned", + "getter_name": "pinned", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"pinned\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"pinned\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "archived", + "getter_name": "archived", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"archived\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"archived\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "joined_group", + "getter_name": "joinedGroup", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"joined_group\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"joined_group\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "left_group", + "getter_name": "leftGroup", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"left_group\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"left_group\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "deleted_content", + "getter_name": "deletedContent", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"deleted_content\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"deleted_content\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "state_version_id", + "getter_name": "stateVersionId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "state_encryption_key", + "getter_name": "stateEncryptionKey", + "moor_type": "blob", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "my_group_private_key", + "getter_name": "myGroupPrivateKey", + "moor_type": "blob", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "group_name", + "getter_name": "groupName", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "draft_message", + "getter_name": "draftMessage", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "total_media_counter", + "getter_name": "totalMediaCounter", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "also_best_friend", + "getter_name": "alsoBestFriend", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"also_best_friend\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"also_best_friend\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "delete_messages_after_milliseconds", + "getter_name": "deleteMessagesAfterMilliseconds", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('86400000')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "created_at", + "getter_name": "createdAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "last_message_send", + "getter_name": "lastMessageSend", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "last_message_received", + "getter_name": "lastMessageReceived", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "last_flame_counter_change", + "getter_name": "lastFlameCounterChange", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "last_flame_sync", + "getter_name": "lastFlameSync", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "flame_counter", + "getter_name": "flameCounter", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "max_flame_counter", + "getter_name": "maxFlameCounter", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "max_flame_counter_from", + "getter_name": "maxFlameCounterFrom", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "last_message_exchange", + "getter_name": "lastMessageExchange", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "group_id" + ] + } + }, + { + "id": 2, + "references": [], + "type": "table", + "data": { + "name": "media_files", + "was_declared_in_moor": false, + "columns": [ + { + "name": "media_id", + "getter_name": "mediaId", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "type", + "getter_name": "type", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [], + "type_converter": { + "dart_expr": "const EnumNameConverter(MediaType.values)", + "dart_type_name": "MediaType" + } + }, + { + "name": "upload_state", + "getter_name": "uploadState", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [], + "type_converter": { + "dart_expr": "const EnumNameConverter(UploadState.values)", + "dart_type_name": "UploadState" + } + }, + { + "name": "download_state", + "getter_name": "downloadState", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [], + "type_converter": { + "dart_expr": "const EnumNameConverter(DownloadState.values)", + "dart_type_name": "DownloadState" + } + }, + { + "name": "requires_authentication", + "getter_name": "requiresAuthentication", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"requires_authentication\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"requires_authentication\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "stored", + "getter_name": "stored", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"stored\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"stored\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "is_draft_media", + "getter_name": "isDraftMedia", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"is_draft_media\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"is_draft_media\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "pre_progressing_process", + "getter_name": "preProgressingProcess", + "moor_type": "int", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "reupload_requested_by", + "getter_name": "reuploadRequestedBy", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [], + "type_converter": { + "dart_expr": "IntListTypeConverter()", + "dart_type_name": "List" + } + }, + { + "name": "display_limit_in_milliseconds", + "getter_name": "displayLimitInMilliseconds", + "moor_type": "int", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "remove_audio", + "getter_name": "removeAudio", + "moor_type": "bool", + "nullable": true, + "customConstraints": null, + "defaultConstraints": "CHECK (\"remove_audio\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"remove_audio\" IN (0, 1))" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "download_token", + "getter_name": "downloadToken", + "moor_type": "blob", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "encryption_key", + "getter_name": "encryptionKey", + "moor_type": "blob", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "encryption_mac", + "getter_name": "encryptionMac", + "moor_type": "blob", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "encryption_nonce", + "getter_name": "encryptionNonce", + "moor_type": "blob", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "stored_file_hash", + "getter_name": "storedFileHash", + "moor_type": "blob", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "created_at", + "getter_name": "createdAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "media_id" + ] + } + }, + { + "id": 3, + "references": [ + 1, + 0, + 2 + ], + "type": "table", + "data": { + "name": "messages", + "was_declared_in_moor": false, + "columns": [ + { + "name": "group_id", + "getter_name": "groupId", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES \"groups\" (group_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES \"groups\" (group_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "groups", + "column": "group_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "message_id", + "getter_name": "messageId", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "sender_id", + "getter_name": "senderId", + "moor_type": "int", + "nullable": true, + "customConstraints": null, + "defaultConstraints": "REFERENCES contacts (user_id)", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES contacts (user_id)" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "contacts", + "column": "user_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": null + } + } + ] + }, + { + "name": "type", + "getter_name": "type", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "content", + "getter_name": "content", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "media_id", + "getter_name": "mediaId", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "defaultConstraints": "REFERENCES media_files (media_id) ON DELETE SET NULL", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES media_files (media_id) ON DELETE SET NULL" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "media_files", + "column": "media_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "setNull" + } + } + ] + }, + { + "name": "additional_message_data", + "getter_name": "additionalMessageData", + "moor_type": "blob", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "media_stored", + "getter_name": "mediaStored", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"media_stored\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"media_stored\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "media_reopened", + "getter_name": "mediaReopened", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"media_reopened\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"media_reopened\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "download_token", + "getter_name": "downloadToken", + "moor_type": "blob", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "quotes_message_id", + "getter_name": "quotesMessageId", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "is_deleted_from_sender", + "getter_name": "isDeletedFromSender", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"is_deleted_from_sender\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"is_deleted_from_sender\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "opened_at", + "getter_name": "openedAt", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "opened_by_all", + "getter_name": "openedByAll", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "created_at", + "getter_name": "createdAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "modified_at", + "getter_name": "modifiedAt", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "ack_by_user", + "getter_name": "ackByUser", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "ack_by_server", + "getter_name": "ackByServer", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "message_id" + ] + } + }, + { + "id": 4, + "references": [ + 3, + 0 + ], + "type": "table", + "data": { + "name": "message_histories", + "was_declared_in_moor": false, + "columns": [ + { + "name": "id", + "getter_name": "id", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "PRIMARY KEY AUTOINCREMENT", + "dialectAwareDefaultConstraints": { + "sqlite": "PRIMARY KEY AUTOINCREMENT" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + "auto-increment" + ] + }, + { + "name": "message_id", + "getter_name": "messageId", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES messages (message_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES messages (message_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "messages", + "column": "message_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "contact_id", + "getter_name": "contactId", + "moor_type": "int", + "nullable": true, + "customConstraints": null, + "defaultConstraints": "REFERENCES contacts (user_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES contacts (user_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "contacts", + "column": "user_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "content", + "getter_name": "content", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "created_at", + "getter_name": "createdAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [] + } + }, + { + "id": 5, + "references": [ + 3, + 0 + ], + "type": "table", + "data": { + "name": "reactions", + "was_declared_in_moor": false, + "columns": [ + { + "name": "message_id", + "getter_name": "messageId", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES messages (message_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES messages (message_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "messages", + "column": "message_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "emoji", + "getter_name": "emoji", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "sender_id", + "getter_name": "senderId", + "moor_type": "int", + "nullable": true, + "customConstraints": null, + "defaultConstraints": "REFERENCES contacts (user_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES contacts (user_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "contacts", + "column": "user_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "created_at", + "getter_name": "createdAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "message_id", + "sender_id", + "emoji" + ] + } + }, + { + "id": 6, + "references": [ + 1, + 0 + ], + "type": "table", + "data": { + "name": "group_members", + "was_declared_in_moor": false, + "columns": [ + { + "name": "group_id", + "getter_name": "groupId", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES \"groups\" (group_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES \"groups\" (group_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "groups", + "column": "group_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "contact_id", + "getter_name": "contactId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES contacts (user_id)", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES contacts (user_id)" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "contacts", + "column": "user_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": null + } + } + ] + }, + { + "name": "member_state", + "getter_name": "memberState", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [], + "type_converter": { + "dart_expr": "const EnumNameConverter(MemberState.values)", + "dart_type_name": "MemberState" + } + }, + { + "name": "group_public_key", + "getter_name": "groupPublicKey", + "moor_type": "blob", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "last_chat_opened", + "getter_name": "lastChatOpened", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "last_type_indicator", + "getter_name": "lastTypeIndicator", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "last_message", + "getter_name": "lastMessage", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "created_at", + "getter_name": "createdAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "group_id", + "contact_id" + ] + } + }, + { + "id": 7, + "references": [ + 0, + 3 + ], + "type": "table", + "data": { + "name": "receipts", + "was_declared_in_moor": false, + "columns": [ + { + "name": "receipt_id", + "getter_name": "receiptId", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "contact_id", + "getter_name": "contactId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES contacts (user_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES contacts (user_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "contacts", + "column": "user_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "message_id", + "getter_name": "messageId", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "defaultConstraints": "REFERENCES messages (message_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES messages (message_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "messages", + "column": "message_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "message", + "getter_name": "message", + "moor_type": "blob", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "contact_will_sends_receipt", + "getter_name": "contactWillSendsReceipt", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"contact_will_sends_receipt\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"contact_will_sends_receipt\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('1')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "will_be_retried_by_media_upload", + "getter_name": "willBeRetriedByMediaUpload", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"will_be_retried_by_media_upload\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"will_be_retried_by_media_upload\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "mark_for_retry", + "getter_name": "markForRetry", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "mark_for_retry_after_accepted", + "getter_name": "markForRetryAfterAccepted", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "ack_by_server_at", + "getter_name": "ackByServerAt", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "retry_count", + "getter_name": "retryCount", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "last_retry", + "getter_name": "lastRetry", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "created_at", + "getter_name": "createdAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "receipt_id" + ] + } + }, + { + "id": 8, + "references": [], + "type": "table", + "data": { + "name": "received_receipts", + "was_declared_in_moor": false, + "columns": [ + { + "name": "receipt_id", + "getter_name": "receiptId", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "created_at", + "getter_name": "createdAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "receipt_id" + ] + } + }, + { + "id": 9, + "references": [], + "type": "table", + "data": { + "name": "signal_identity_key_stores", + "was_declared_in_moor": false, + "columns": [ + { + "name": "device_id", + "getter_name": "deviceId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "name", + "getter_name": "name", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "identity_key", + "getter_name": "identityKey", + "moor_type": "blob", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "created_at", + "getter_name": "createdAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "device_id", + "name" + ] + } + }, + { + "id": 10, + "references": [], + "type": "table", + "data": { + "name": "signal_pre_key_stores", + "was_declared_in_moor": false, + "columns": [ + { + "name": "pre_key_id", + "getter_name": "preKeyId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "pre_key", + "getter_name": "preKey", + "moor_type": "blob", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "created_at", + "getter_name": "createdAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "pre_key_id" + ] + } + }, + { + "id": 11, + "references": [], + "type": "table", + "data": { + "name": "signal_sender_key_stores", + "was_declared_in_moor": false, + "columns": [ + { + "name": "sender_key_name", + "getter_name": "senderKeyName", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "sender_key", + "getter_name": "senderKey", + "moor_type": "blob", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "sender_key_name" + ] + } + }, + { + "id": 12, + "references": [], + "type": "table", + "data": { + "name": "signal_session_stores", + "was_declared_in_moor": false, + "columns": [ + { + "name": "device_id", + "getter_name": "deviceId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "name", + "getter_name": "name", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "session_record", + "getter_name": "sessionRecord", + "moor_type": "blob", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "created_at", + "getter_name": "createdAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "device_id", + "name" + ] + } + }, + { + "id": 13, + "references": [ + 3, + 0 + ], + "type": "table", + "data": { + "name": "message_actions", + "was_declared_in_moor": false, + "columns": [ + { + "name": "message_id", + "getter_name": "messageId", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES messages (message_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES messages (message_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "messages", + "column": "message_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "contact_id", + "getter_name": "contactId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES contacts (user_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES contacts (user_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "contacts", + "column": "user_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "type", + "getter_name": "type", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [], + "type_converter": { + "dart_expr": "const EnumNameConverter(MessageActionType.values)", + "dart_type_name": "MessageActionType" + } + }, + { + "name": "action_at", + "getter_name": "actionAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "message_id", + "contact_id", + "type" + ] + } + }, + { + "id": 14, + "references": [ + 1, + 0 + ], + "type": "table", + "data": { + "name": "group_histories", + "was_declared_in_moor": false, + "columns": [ + { + "name": "group_history_id", + "getter_name": "groupHistoryId", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "group_id", + "getter_name": "groupId", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES \"groups\" (group_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES \"groups\" (group_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "groups", + "column": "group_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "contact_id", + "getter_name": "contactId", + "moor_type": "int", + "nullable": true, + "customConstraints": null, + "defaultConstraints": "REFERENCES contacts (user_id)", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES contacts (user_id)" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "contacts", + "column": "user_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": null + } + } + ] + }, + { + "name": "affected_contact_id", + "getter_name": "affectedContactId", + "moor_type": "int", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "old_group_name", + "getter_name": "oldGroupName", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "new_group_name", + "getter_name": "newGroupName", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "new_delete_messages_after_milliseconds", + "getter_name": "newDeleteMessagesAfterMilliseconds", + "moor_type": "int", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "type", + "getter_name": "type", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [], + "type_converter": { + "dart_expr": "const EnumNameConverter(GroupActionType.values)", + "dart_type_name": "GroupActionType" + } + }, + { + "name": "action_at", + "getter_name": "actionAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "group_history_id" + ] + } + }, + { + "id": 15, + "references": [ + 0 + ], + "type": "table", + "data": { + "name": "key_verifications", + "was_declared_in_moor": false, + "columns": [ + { + "name": "verification_id", + "getter_name": "verificationId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "PRIMARY KEY AUTOINCREMENT", + "dialectAwareDefaultConstraints": { + "sqlite": "PRIMARY KEY AUTOINCREMENT" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + "auto-increment" + ] + }, + { + "name": "contact_id", + "getter_name": "contactId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES contacts (user_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES contacts (user_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "contacts", + "column": "user_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "type", + "getter_name": "type", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [], + "type_converter": { + "dart_expr": "const EnumNameConverter(VerificationType.values)", + "dart_type_name": "VerificationType" + } + }, + { + "name": "created_at", + "getter_name": "createdAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [] + } + }, + { + "id": 16, + "references": [], + "type": "table", + "data": { + "name": "verification_tokens", + "was_declared_in_moor": false, + "columns": [ + { + "name": "token_id", + "getter_name": "tokenId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "PRIMARY KEY AUTOINCREMENT", + "dialectAwareDefaultConstraints": { + "sqlite": "PRIMARY KEY AUTOINCREMENT" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + "auto-increment" + ] + }, + { + "name": "token", + "getter_name": "token", + "moor_type": "blob", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "created_at", + "getter_name": "createdAt", + "moor_type": "dateTime", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [] + } + }, + { + "id": 17, + "references": [], + "type": "table", + "data": { + "name": "user_discovery_announced_users", + "was_declared_in_moor": false, + "columns": [ + { + "name": "announced_user_id", + "getter_name": "announcedUserId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "announced_public_key", + "getter_name": "announcedPublicKey", + "moor_type": "blob", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "public_id", + "getter_name": "publicId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "UNIQUE", + "dialectAwareDefaultConstraints": { + "sqlite": "UNIQUE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + "unique" + ] + }, + { + "name": "username", + "getter_name": "username", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "was_shown_to_the_user", + "getter_name": "wasShownToTheUser", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"was_shown_to_the_user\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"was_shown_to_the_user\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "is_hidden", + "getter_name": "isHidden", + "moor_type": "bool", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "CHECK (\"is_hidden\" IN (0, 1))", + "dialectAwareDefaultConstraints": { + "sqlite": "CHECK (\"is_hidden\" IN (0, 1))" + }, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "announced_user_id" + ] + } + }, + { + "id": 18, + "references": [ + 17, + 0 + ], + "type": "table", + "data": { + "name": "user_discovery_user_relations", + "was_declared_in_moor": false, + "columns": [ + { + "name": "announced_user_id", + "getter_name": "announcedUserId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES user_discovery_announced_users (announced_user_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES user_discovery_announced_users (announced_user_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "user_discovery_announced_users", + "column": "announced_user_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "from_contact_id", + "getter_name": "fromContactId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES contacts (user_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES contacts (user_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "contacts", + "column": "user_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "public_key_verified_timestamp", + "getter_name": "publicKeyVerifiedTimestamp", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "announced_user_id", + "from_contact_id" + ] + } + }, + { + "id": 19, + "references": [ + 0 + ], + "type": "table", + "data": { + "name": "user_discovery_other_promotions", + "was_declared_in_moor": false, + "columns": [ + { + "name": "from_contact_id", + "getter_name": "fromContactId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES contacts (user_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES contacts (user_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "contacts", + "column": "user_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "promotion_id", + "getter_name": "promotionId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "public_id", + "getter_name": "publicId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "threshold", + "getter_name": "threshold", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "announcement_share", + "getter_name": "announcementShare", + "moor_type": "blob", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "public_key_verified_timestamp", + "getter_name": "publicKeyVerifiedTimestamp", + "moor_type": "dateTime", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "from_contact_id", + "public_id" + ] + } + }, + { + "id": 20, + "references": [ + 0 + ], + "type": "table", + "data": { + "name": "user_discovery_own_promotions", + "was_declared_in_moor": false, + "columns": [ + { + "name": "version_id", + "getter_name": "versionId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "PRIMARY KEY AUTOINCREMENT", + "dialectAwareDefaultConstraints": { + "sqlite": "PRIMARY KEY AUTOINCREMENT" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + "auto-increment" + ] + }, + { + "name": "contact_id", + "getter_name": "contactId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES contacts (user_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES contacts (user_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "contacts", + "column": "user_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "promotion", + "getter_name": "promotion", + "moor_type": "blob", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [] + } + }, + { + "id": 21, + "references": [ + 0 + ], + "type": "table", + "data": { + "name": "user_discovery_shares", + "was_declared_in_moor": false, + "columns": [ + { + "name": "share_id", + "getter_name": "shareId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "PRIMARY KEY AUTOINCREMENT", + "dialectAwareDefaultConstraints": { + "sqlite": "PRIMARY KEY AUTOINCREMENT" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + "auto-increment" + ] + }, + { + "name": "share", + "getter_name": "share", + "moor_type": "blob", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "contact_id", + "getter_name": "contactId", + "moor_type": "int", + "nullable": true, + "customConstraints": null, + "defaultConstraints": "REFERENCES contacts (user_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES contacts (user_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "contacts", + "column": "user_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [] + } + }, + { + "id": 22, + "references": [], + "type": "table", + "data": { + "name": "shortcuts", + "was_declared_in_moor": false, + "columns": [ + { + "name": "id", + "getter_name": "id", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "PRIMARY KEY AUTOINCREMENT", + "dialectAwareDefaultConstraints": { + "sqlite": "PRIMARY KEY AUTOINCREMENT" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + "auto-increment" + ] + }, + { + "name": "emoji", + "getter_name": "emoji", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "UNIQUE", + "dialectAwareDefaultConstraints": { + "sqlite": "UNIQUE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + "unique" + ] + }, + { + "name": "usage_counter", + "getter_name": "usageCounter", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "default_dart": "const CustomExpression('0')", + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [] + } + }, + { + "id": 23, + "references": [ + 22, + 1 + ], + "type": "table", + "data": { + "name": "shortcut_members", + "was_declared_in_moor": false, + "columns": [ + { + "name": "shortcut_id", + "getter_name": "shortcutId", + "moor_type": "int", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES shortcuts (id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES shortcuts (id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "shortcuts", + "column": "id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + }, + { + "name": "group_id", + "getter_name": "groupId", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "defaultConstraints": "REFERENCES \"groups\" (group_id) ON DELETE CASCADE", + "dialectAwareDefaultConstraints": { + "sqlite": "REFERENCES \"groups\" (group_id) ON DELETE CASCADE" + }, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [ + { + "foreign_key": { + "to": { + "table": "groups", + "column": "group_id" + }, + "initially_deferred": false, + "on_update": null, + "on_delete": "cascade" + } + } + ] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "shortcut_id", + "group_id" + ] + } + } + ], + "fixed_sql": [ + { + "name": "contacts", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"contacts\" (\"user_id\" INTEGER NOT NULL, \"username\" TEXT NOT NULL, \"display_name\" TEXT NULL, \"nick_name\" TEXT NULL, \"avatar_svg_compressed\" BLOB NULL, \"sender_profile_counter\" INTEGER NOT NULL DEFAULT 0, \"accepted\" INTEGER NOT NULL DEFAULT 0 CHECK (\"accepted\" IN (0, 1)), \"deleted_by_user\" INTEGER NOT NULL DEFAULT 0 CHECK (\"deleted_by_user\" IN (0, 1)), \"requested\" INTEGER NOT NULL DEFAULT 0 CHECK (\"requested\" IN (0, 1)), \"blocked\" INTEGER NOT NULL DEFAULT 0 CHECK (\"blocked\" IN (0, 1)), \"verified\" INTEGER NOT NULL DEFAULT 0 CHECK (\"verified\" IN (0, 1)), \"account_deleted\" INTEGER NOT NULL DEFAULT 0 CHECK (\"account_deleted\" IN (0, 1)), \"created_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)), \"user_discovery_version\" BLOB NULL, \"user_discovery_excluded\" INTEGER NOT NULL DEFAULT 0 CHECK (\"user_discovery_excluded\" IN (0, 1)), \"user_discovery_manual_approved\" INTEGER NULL DEFAULT 0 CHECK (\"user_discovery_manual_approved\" IN (0, 1)), \"media_send_counter\" INTEGER NOT NULL DEFAULT 0, \"media_received_counter\" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY (\"user_id\"));" + } + ] + }, + { + "name": "groups", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"groups\" (\"group_id\" TEXT NOT NULL, \"is_group_admin\" INTEGER NOT NULL DEFAULT 0 CHECK (\"is_group_admin\" IN (0, 1)), \"is_direct_chat\" INTEGER NOT NULL DEFAULT 0 CHECK (\"is_direct_chat\" IN (0, 1)), \"pinned\" INTEGER NOT NULL DEFAULT 0 CHECK (\"pinned\" IN (0, 1)), \"archived\" INTEGER NOT NULL DEFAULT 0 CHECK (\"archived\" IN (0, 1)), \"joined_group\" INTEGER NOT NULL DEFAULT 0 CHECK (\"joined_group\" IN (0, 1)), \"left_group\" INTEGER NOT NULL DEFAULT 0 CHECK (\"left_group\" IN (0, 1)), \"deleted_content\" INTEGER NOT NULL DEFAULT 0 CHECK (\"deleted_content\" IN (0, 1)), \"state_version_id\" INTEGER NOT NULL DEFAULT 0, \"state_encryption_key\" BLOB NULL, \"my_group_private_key\" BLOB NULL, \"group_name\" TEXT NOT NULL, \"draft_message\" TEXT NULL, \"total_media_counter\" INTEGER NOT NULL DEFAULT 0, \"also_best_friend\" INTEGER NOT NULL DEFAULT 0 CHECK (\"also_best_friend\" IN (0, 1)), \"delete_messages_after_milliseconds\" INTEGER NOT NULL DEFAULT 86400000, \"created_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)), \"last_message_send\" INTEGER NULL, \"last_message_received\" INTEGER NULL, \"last_flame_counter_change\" INTEGER NULL, \"last_flame_sync\" INTEGER NULL, \"flame_counter\" INTEGER NOT NULL DEFAULT 0, \"max_flame_counter\" INTEGER NOT NULL DEFAULT 0, \"max_flame_counter_from\" INTEGER NULL, \"last_message_exchange\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)), PRIMARY KEY (\"group_id\"));" + } + ] + }, + { + "name": "media_files", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"media_files\" (\"media_id\" TEXT NOT NULL, \"type\" TEXT NOT NULL, \"upload_state\" TEXT NULL, \"download_state\" TEXT NULL, \"requires_authentication\" INTEGER NOT NULL DEFAULT 0 CHECK (\"requires_authentication\" IN (0, 1)), \"stored\" INTEGER NOT NULL DEFAULT 0 CHECK (\"stored\" IN (0, 1)), \"is_draft_media\" INTEGER NOT NULL DEFAULT 0 CHECK (\"is_draft_media\" IN (0, 1)), \"pre_progressing_process\" INTEGER NULL, \"reupload_requested_by\" TEXT NULL, \"display_limit_in_milliseconds\" INTEGER NULL, \"remove_audio\" INTEGER NULL CHECK (\"remove_audio\" IN (0, 1)), \"download_token\" BLOB NULL, \"encryption_key\" BLOB NULL, \"encryption_mac\" BLOB NULL, \"encryption_nonce\" BLOB NULL, \"stored_file_hash\" BLOB NULL, \"created_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)), PRIMARY KEY (\"media_id\"));" + } + ] + }, + { + "name": "messages", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"messages\" (\"group_id\" TEXT NOT NULL REFERENCES \"groups\" (group_id) ON DELETE CASCADE, \"message_id\" TEXT NOT NULL, \"sender_id\" INTEGER NULL REFERENCES contacts (user_id), \"type\" TEXT NOT NULL, \"content\" TEXT NULL, \"media_id\" TEXT NULL REFERENCES media_files (media_id) ON DELETE SET NULL, \"additional_message_data\" BLOB NULL, \"media_stored\" INTEGER NOT NULL DEFAULT 0 CHECK (\"media_stored\" IN (0, 1)), \"media_reopened\" INTEGER NOT NULL DEFAULT 0 CHECK (\"media_reopened\" IN (0, 1)), \"download_token\" BLOB NULL, \"quotes_message_id\" TEXT NULL, \"is_deleted_from_sender\" INTEGER NOT NULL DEFAULT 0 CHECK (\"is_deleted_from_sender\" IN (0, 1)), \"opened_at\" INTEGER NULL, \"opened_by_all\" INTEGER NULL, \"created_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)), \"modified_at\" INTEGER NULL, \"ack_by_user\" INTEGER NULL, \"ack_by_server\" INTEGER NULL, PRIMARY KEY (\"message_id\"));" + } + ] + }, + { + "name": "message_histories", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"message_histories\" (\"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \"message_id\" TEXT NOT NULL REFERENCES messages (message_id) ON DELETE CASCADE, \"contact_id\" INTEGER NULL REFERENCES contacts (user_id) ON DELETE CASCADE, \"content\" TEXT NULL, \"created_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)));" + } + ] + }, + { + "name": "reactions", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"reactions\" (\"message_id\" TEXT NOT NULL REFERENCES messages (message_id) ON DELETE CASCADE, \"emoji\" TEXT NOT NULL, \"sender_id\" INTEGER NULL REFERENCES contacts (user_id) ON DELETE CASCADE, \"created_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)), PRIMARY KEY (\"message_id\", \"sender_id\", \"emoji\"));" + } + ] + }, + { + "name": "group_members", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"group_members\" (\"group_id\" TEXT NOT NULL REFERENCES \"groups\" (group_id) ON DELETE CASCADE, \"contact_id\" INTEGER NOT NULL REFERENCES contacts (user_id), \"member_state\" TEXT NULL, \"group_public_key\" BLOB NULL, \"last_chat_opened\" INTEGER NULL, \"last_type_indicator\" INTEGER NULL, \"last_message\" INTEGER NULL, \"created_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)), PRIMARY KEY (\"group_id\", \"contact_id\"));" + } + ] + }, + { + "name": "receipts", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"receipts\" (\"receipt_id\" TEXT NOT NULL, \"contact_id\" INTEGER NOT NULL REFERENCES contacts (user_id) ON DELETE CASCADE, \"message_id\" TEXT NULL REFERENCES messages (message_id) ON DELETE CASCADE, \"message\" BLOB NOT NULL, \"contact_will_sends_receipt\" INTEGER NOT NULL DEFAULT 1 CHECK (\"contact_will_sends_receipt\" IN (0, 1)), \"will_be_retried_by_media_upload\" INTEGER NOT NULL DEFAULT 0 CHECK (\"will_be_retried_by_media_upload\" IN (0, 1)), \"mark_for_retry\" INTEGER NULL, \"mark_for_retry_after_accepted\" INTEGER NULL, \"ack_by_server_at\" INTEGER NULL, \"retry_count\" INTEGER NOT NULL DEFAULT 0, \"last_retry\" INTEGER NULL, \"created_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)), PRIMARY KEY (\"receipt_id\"));" + } + ] + }, + { + "name": "received_receipts", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"received_receipts\" (\"receipt_id\" TEXT NOT NULL, \"created_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)), PRIMARY KEY (\"receipt_id\"));" + } + ] + }, + { + "name": "signal_identity_key_stores", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"signal_identity_key_stores\" (\"device_id\" INTEGER NOT NULL, \"name\" TEXT NOT NULL, \"identity_key\" BLOB NOT NULL, \"created_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)), PRIMARY KEY (\"device_id\", \"name\"));" + } + ] + }, + { + "name": "signal_pre_key_stores", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"signal_pre_key_stores\" (\"pre_key_id\" INTEGER NOT NULL, \"pre_key\" BLOB NOT NULL, \"created_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)), PRIMARY KEY (\"pre_key_id\"));" + } + ] + }, + { + "name": "signal_sender_key_stores", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"signal_sender_key_stores\" (\"sender_key_name\" TEXT NOT NULL, \"sender_key\" BLOB NOT NULL, PRIMARY KEY (\"sender_key_name\"));" + } + ] + }, + { + "name": "signal_session_stores", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"signal_session_stores\" (\"device_id\" INTEGER NOT NULL, \"name\" TEXT NOT NULL, \"session_record\" BLOB NOT NULL, \"created_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)), PRIMARY KEY (\"device_id\", \"name\"));" + } + ] + }, + { + "name": "message_actions", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"message_actions\" (\"message_id\" TEXT NOT NULL REFERENCES messages (message_id) ON DELETE CASCADE, \"contact_id\" INTEGER NOT NULL REFERENCES contacts (user_id) ON DELETE CASCADE, \"type\" TEXT NOT NULL, \"action_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)), PRIMARY KEY (\"message_id\", \"contact_id\", \"type\"));" + } + ] + }, + { + "name": "group_histories", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"group_histories\" (\"group_history_id\" TEXT NOT NULL, \"group_id\" TEXT NOT NULL REFERENCES \"groups\" (group_id) ON DELETE CASCADE, \"contact_id\" INTEGER NULL REFERENCES contacts (user_id), \"affected_contact_id\" INTEGER NULL, \"old_group_name\" TEXT NULL, \"new_group_name\" TEXT NULL, \"new_delete_messages_after_milliseconds\" INTEGER NULL, \"type\" TEXT NOT NULL, \"action_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)), PRIMARY KEY (\"group_history_id\"));" + } + ] + }, + { + "name": "key_verifications", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"key_verifications\" (\"verification_id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \"contact_id\" INTEGER NOT NULL REFERENCES contacts (user_id) ON DELETE CASCADE, \"type\" TEXT NOT NULL, \"created_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)));" + } + ] + }, + { + "name": "verification_tokens", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"verification_tokens\" (\"token_id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \"token\" BLOB NOT NULL, \"created_at\" INTEGER NOT NULL DEFAULT (CAST(strftime('%s', CURRENT_TIMESTAMP) AS INTEGER)));" + } + ] + }, + { + "name": "user_discovery_announced_users", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"user_discovery_announced_users\" (\"announced_user_id\" INTEGER NOT NULL, \"announced_public_key\" BLOB NOT NULL, \"public_id\" INTEGER NOT NULL UNIQUE, \"username\" TEXT NULL, \"was_shown_to_the_user\" INTEGER NOT NULL DEFAULT 0 CHECK (\"was_shown_to_the_user\" IN (0, 1)), \"is_hidden\" INTEGER NOT NULL DEFAULT 0 CHECK (\"is_hidden\" IN (0, 1)), PRIMARY KEY (\"announced_user_id\"));" + } + ] + }, + { + "name": "user_discovery_user_relations", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"user_discovery_user_relations\" (\"announced_user_id\" INTEGER NOT NULL REFERENCES user_discovery_announced_users (announced_user_id) ON DELETE CASCADE, \"from_contact_id\" INTEGER NOT NULL REFERENCES contacts (user_id) ON DELETE CASCADE, \"public_key_verified_timestamp\" INTEGER NULL, PRIMARY KEY (\"announced_user_id\", \"from_contact_id\"));" + } + ] + }, + { + "name": "user_discovery_other_promotions", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"user_discovery_other_promotions\" (\"from_contact_id\" INTEGER NOT NULL REFERENCES contacts (user_id) ON DELETE CASCADE, \"promotion_id\" INTEGER NOT NULL, \"public_id\" INTEGER NOT NULL, \"threshold\" INTEGER NOT NULL, \"announcement_share\" BLOB NOT NULL, \"public_key_verified_timestamp\" INTEGER NULL, PRIMARY KEY (\"from_contact_id\", \"public_id\"));" + } + ] + }, + { + "name": "user_discovery_own_promotions", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"user_discovery_own_promotions\" (\"version_id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \"contact_id\" INTEGER NOT NULL REFERENCES contacts (user_id) ON DELETE CASCADE, \"promotion\" BLOB NOT NULL);" + } + ] + }, + { + "name": "user_discovery_shares", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"user_discovery_shares\" (\"share_id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \"share\" BLOB NOT NULL, \"contact_id\" INTEGER NULL REFERENCES contacts (user_id) ON DELETE CASCADE);" + } + ] + }, + { + "name": "shortcuts", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"shortcuts\" (\"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \"emoji\" TEXT NOT NULL UNIQUE, \"usage_counter\" INTEGER NOT NULL DEFAULT 0);" + } + ] + }, + { + "name": "shortcut_members", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"shortcut_members\" (\"shortcut_id\" INTEGER NOT NULL REFERENCES shortcuts (id) ON DELETE CASCADE, \"group_id\" TEXT NOT NULL REFERENCES \"groups\" (group_id) ON DELETE CASCADE, PRIMARY KEY (\"shortcut_id\", \"group_id\"));" + } + ] + } + ] +} \ No newline at end of file diff --git a/lib/src/database/tables/shortcuts.table.dart b/lib/src/database/tables/shortcuts.table.dart new file mode 100644 index 00000000..43cda3a7 --- /dev/null +++ b/lib/src/database/tables/shortcuts.table.dart @@ -0,0 +1,26 @@ +import 'package:drift/drift.dart'; +import 'package:twonly/src/database/tables/groups.table.dart'; + +@DataClassName('Shortcut') +class Shortcuts extends Table { + IntColumn get id => integer().autoIncrement()(); + TextColumn get emoji => text().unique()(); + IntColumn get usageCounter => integer().withDefault(const Constant(0))(); +} + +@DataClassName('ShortcutMember') +class ShortcutMembers extends Table { + IntColumn get shortcutId => integer().references( + Shortcuts, + #id, + onDelete: KeyAction.cascade, + )(); + TextColumn get groupId => text().references( + Groups, + #groupId, + onDelete: KeyAction.cascade, + )(); + + @override + Set get primaryKey => {shortcutId, groupId}; +} diff --git a/lib/src/database/twonly.db.dart b/lib/src/database/twonly.db.dart index a53703bb..bba50b61 100644 --- a/lib/src/database/twonly.db.dart +++ b/lib/src/database/twonly.db.dart @@ -10,6 +10,7 @@ import 'package:twonly/src/database/daos/mediafiles.dao.dart'; import 'package:twonly/src/database/daos/messages.dao.dart'; import 'package:twonly/src/database/daos/reactions.dao.dart'; import 'package:twonly/src/database/daos/receipts.dao.dart'; +import 'package:twonly/src/database/daos/shortcuts.dao.dart'; import 'package:twonly/src/database/daos/user_discovery.dao.dart'; import 'package:twonly/src/database/tables/contacts.table.dart'; import 'package:twonly/src/database/tables/groups.table.dart'; @@ -17,6 +18,7 @@ import 'package:twonly/src/database/tables/mediafiles.table.dart'; import 'package:twonly/src/database/tables/messages.table.dart'; import 'package:twonly/src/database/tables/reactions.table.dart'; import 'package:twonly/src/database/tables/receipts.table.dart'; +import 'package:twonly/src/database/tables/shortcuts.table.dart'; import 'package:twonly/src/database/tables/signal_identity_key_store.table.dart'; import 'package:twonly/src/database/tables/signal_pre_key_store.table.dart'; import 'package:twonly/src/database/tables/signal_sender_key_store.table.dart'; @@ -52,6 +54,8 @@ part 'twonly.db.g.dart'; UserDiscoveryOtherPromotions, UserDiscoveryOwnPromotions, UserDiscoveryShares, + Shortcuts, + ShortcutMembers, ], daos: [ MessagesDao, @@ -62,6 +66,7 @@ part 'twonly.db.g.dart'; MediaFilesDao, UserDiscoveryDao, KeyVerificationDao, + ShortcutsDao, ], ) class TwonlyDB extends _$TwonlyDB { @@ -74,7 +79,7 @@ class TwonlyDB extends _$TwonlyDB { TwonlyDB.forTesting(DatabaseConnection super.connection); @override - int get schemaVersion => 12; + int get schemaVersion => 13; static QueryExecutor _openConnection() { return driftDatabase( @@ -186,6 +191,10 @@ class TwonlyDB extends _$TwonlyDB { await m.addColumn(schema.contacts, column); } }, + from12To13: (m, schema) async { + await m.createTable(schema.shortcuts); + await m.createTable(schema.shortcutMembers); + }, )(m, from, to); }, ); diff --git a/lib/src/database/twonly.db.g.dart b/lib/src/database/twonly.db.g.dart index 7a2f7f69..2d241408 100644 --- a/lib/src/database/twonly.db.g.dart +++ b/lib/src/database/twonly.db.g.dart @@ -11456,6 +11456,483 @@ class UserDiscoverySharesCompanion extends UpdateCompanion { } } +class $ShortcutsTable extends Shortcuts + with TableInfo<$ShortcutsTable, Shortcut> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $ShortcutsTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'PRIMARY KEY AUTOINCREMENT', + ), + ); + static const VerificationMeta _emojiMeta = const VerificationMeta('emoji'); + @override + late final GeneratedColumn emoji = GeneratedColumn( + 'emoji', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE'), + ); + static const VerificationMeta _usageCounterMeta = const VerificationMeta( + 'usageCounter', + ); + @override + late final GeneratedColumn usageCounter = GeneratedColumn( + 'usage_counter', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(0), + ); + @override + List get $columns => [id, emoji, usageCounter]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'shortcuts'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } + if (data.containsKey('emoji')) { + context.handle( + _emojiMeta, + emoji.isAcceptableOrUnknown(data['emoji']!, _emojiMeta), + ); + } else if (isInserting) { + context.missing(_emojiMeta); + } + if (data.containsKey('usage_counter')) { + context.handle( + _usageCounterMeta, + usageCounter.isAcceptableOrUnknown( + data['usage_counter']!, + _usageCounterMeta, + ), + ); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + Shortcut map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return Shortcut( + id: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}id'], + )!, + emoji: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}emoji'], + )!, + usageCounter: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}usage_counter'], + )!, + ); + } + + @override + $ShortcutsTable createAlias(String alias) { + return $ShortcutsTable(attachedDatabase, alias); + } +} + +class Shortcut extends DataClass implements Insertable { + final int id; + final String emoji; + final int usageCounter; + const Shortcut({ + required this.id, + required this.emoji, + required this.usageCounter, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['emoji'] = Variable(emoji); + map['usage_counter'] = Variable(usageCounter); + return map; + } + + ShortcutsCompanion toCompanion(bool nullToAbsent) { + return ShortcutsCompanion( + id: Value(id), + emoji: Value(emoji), + usageCounter: Value(usageCounter), + ); + } + + factory Shortcut.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return Shortcut( + id: serializer.fromJson(json['id']), + emoji: serializer.fromJson(json['emoji']), + usageCounter: serializer.fromJson(json['usageCounter']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'emoji': serializer.toJson(emoji), + 'usageCounter': serializer.toJson(usageCounter), + }; + } + + Shortcut copyWith({int? id, String? emoji, int? usageCounter}) => Shortcut( + id: id ?? this.id, + emoji: emoji ?? this.emoji, + usageCounter: usageCounter ?? this.usageCounter, + ); + Shortcut copyWithCompanion(ShortcutsCompanion data) { + return Shortcut( + id: data.id.present ? data.id.value : this.id, + emoji: data.emoji.present ? data.emoji.value : this.emoji, + usageCounter: data.usageCounter.present + ? data.usageCounter.value + : this.usageCounter, + ); + } + + @override + String toString() { + return (StringBuffer('Shortcut(') + ..write('id: $id, ') + ..write('emoji: $emoji, ') + ..write('usageCounter: $usageCounter') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, emoji, usageCounter); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is Shortcut && + other.id == this.id && + other.emoji == this.emoji && + other.usageCounter == this.usageCounter); +} + +class ShortcutsCompanion extends UpdateCompanion { + final Value id; + final Value emoji; + final Value usageCounter; + const ShortcutsCompanion({ + this.id = const Value.absent(), + this.emoji = const Value.absent(), + this.usageCounter = const Value.absent(), + }); + ShortcutsCompanion.insert({ + this.id = const Value.absent(), + required String emoji, + this.usageCounter = const Value.absent(), + }) : emoji = Value(emoji); + static Insertable custom({ + Expression? id, + Expression? emoji, + Expression? usageCounter, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (emoji != null) 'emoji': emoji, + if (usageCounter != null) 'usage_counter': usageCounter, + }); + } + + ShortcutsCompanion copyWith({ + Value? id, + Value? emoji, + Value? usageCounter, + }) { + return ShortcutsCompanion( + id: id ?? this.id, + emoji: emoji ?? this.emoji, + usageCounter: usageCounter ?? this.usageCounter, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (emoji.present) { + map['emoji'] = Variable(emoji.value); + } + if (usageCounter.present) { + map['usage_counter'] = Variable(usageCounter.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ShortcutsCompanion(') + ..write('id: $id, ') + ..write('emoji: $emoji, ') + ..write('usageCounter: $usageCounter') + ..write(')')) + .toString(); + } +} + +class $ShortcutMembersTable extends ShortcutMembers + with TableInfo<$ShortcutMembersTable, ShortcutMember> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $ShortcutMembersTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _shortcutIdMeta = const VerificationMeta( + 'shortcutId', + ); + @override + late final GeneratedColumn shortcutId = GeneratedColumn( + 'shortcut_id', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES shortcuts (id) ON DELETE CASCADE', + ), + ); + static const VerificationMeta _groupIdMeta = const VerificationMeta( + 'groupId', + ); + @override + late final GeneratedColumn groupId = GeneratedColumn( + 'group_id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES "groups" (group_id) ON DELETE CASCADE', + ), + ); + @override + List get $columns => [shortcutId, groupId]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'shortcut_members'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('shortcut_id')) { + context.handle( + _shortcutIdMeta, + shortcutId.isAcceptableOrUnknown(data['shortcut_id']!, _shortcutIdMeta), + ); + } else if (isInserting) { + context.missing(_shortcutIdMeta); + } + if (data.containsKey('group_id')) { + context.handle( + _groupIdMeta, + groupId.isAcceptableOrUnknown(data['group_id']!, _groupIdMeta), + ); + } else if (isInserting) { + context.missing(_groupIdMeta); + } + return context; + } + + @override + Set get $primaryKey => {shortcutId, groupId}; + @override + ShortcutMember map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ShortcutMember( + shortcutId: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}shortcut_id'], + )!, + groupId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}group_id'], + )!, + ); + } + + @override + $ShortcutMembersTable createAlias(String alias) { + return $ShortcutMembersTable(attachedDatabase, alias); + } +} + +class ShortcutMember extends DataClass implements Insertable { + final int shortcutId; + final String groupId; + const ShortcutMember({required this.shortcutId, required this.groupId}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['shortcut_id'] = Variable(shortcutId); + map['group_id'] = Variable(groupId); + return map; + } + + ShortcutMembersCompanion toCompanion(bool nullToAbsent) { + return ShortcutMembersCompanion( + shortcutId: Value(shortcutId), + groupId: Value(groupId), + ); + } + + factory ShortcutMember.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ShortcutMember( + shortcutId: serializer.fromJson(json['shortcutId']), + groupId: serializer.fromJson(json['groupId']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'shortcutId': serializer.toJson(shortcutId), + 'groupId': serializer.toJson(groupId), + }; + } + + ShortcutMember copyWith({int? shortcutId, String? groupId}) => ShortcutMember( + shortcutId: shortcutId ?? this.shortcutId, + groupId: groupId ?? this.groupId, + ); + ShortcutMember copyWithCompanion(ShortcutMembersCompanion data) { + return ShortcutMember( + shortcutId: data.shortcutId.present + ? data.shortcutId.value + : this.shortcutId, + groupId: data.groupId.present ? data.groupId.value : this.groupId, + ); + } + + @override + String toString() { + return (StringBuffer('ShortcutMember(') + ..write('shortcutId: $shortcutId, ') + ..write('groupId: $groupId') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(shortcutId, groupId); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ShortcutMember && + other.shortcutId == this.shortcutId && + other.groupId == this.groupId); +} + +class ShortcutMembersCompanion extends UpdateCompanion { + final Value shortcutId; + final Value groupId; + final Value rowid; + const ShortcutMembersCompanion({ + this.shortcutId = const Value.absent(), + this.groupId = const Value.absent(), + this.rowid = const Value.absent(), + }); + ShortcutMembersCompanion.insert({ + required int shortcutId, + required String groupId, + this.rowid = const Value.absent(), + }) : shortcutId = Value(shortcutId), + groupId = Value(groupId); + static Insertable custom({ + Expression? shortcutId, + Expression? groupId, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (shortcutId != null) 'shortcut_id': shortcutId, + if (groupId != null) 'group_id': groupId, + if (rowid != null) 'rowid': rowid, + }); + } + + ShortcutMembersCompanion copyWith({ + Value? shortcutId, + Value? groupId, + Value? rowid, + }) { + return ShortcutMembersCompanion( + shortcutId: shortcutId ?? this.shortcutId, + groupId: groupId ?? this.groupId, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (shortcutId.present) { + map['shortcut_id'] = Variable(shortcutId.value); + } + if (groupId.present) { + map['group_id'] = Variable(groupId.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ShortcutMembersCompanion(') + ..write('shortcutId: $shortcutId, ') + ..write('groupId: $groupId, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + abstract class _$TwonlyDB extends GeneratedDatabase { _$TwonlyDB(QueryExecutor e) : super(e); $TwonlyDBManager get managers => $TwonlyDBManager(this); @@ -11497,6 +11974,10 @@ abstract class _$TwonlyDB extends GeneratedDatabase { $UserDiscoveryOwnPromotionsTable(this); late final $UserDiscoverySharesTable userDiscoveryShares = $UserDiscoverySharesTable(this); + late final $ShortcutsTable shortcuts = $ShortcutsTable(this); + late final $ShortcutMembersTable shortcutMembers = $ShortcutMembersTable( + this, + ); late final MessagesDao messagesDao = MessagesDao(this as TwonlyDB); late final ContactsDao contactsDao = ContactsDao(this as TwonlyDB); late final ReceiptsDao receiptsDao = ReceiptsDao(this as TwonlyDB); @@ -11509,6 +11990,7 @@ abstract class _$TwonlyDB extends GeneratedDatabase { late final KeyVerificationDao keyVerificationDao = KeyVerificationDao( this as TwonlyDB, ); + late final ShortcutsDao shortcutsDao = ShortcutsDao(this as TwonlyDB); @override Iterable> get allTables => allSchemaEntities.whereType>(); @@ -11536,6 +12018,8 @@ abstract class _$TwonlyDB extends GeneratedDatabase { userDiscoveryOtherPromotions, userDiscoveryOwnPromotions, userDiscoveryShares, + shortcuts, + shortcutMembers, ]; @override StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules([ @@ -11673,6 +12157,20 @@ abstract class _$TwonlyDB extends GeneratedDatabase { ), result: [TableUpdate('user_discovery_shares', kind: UpdateKind.delete)], ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'shortcuts', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('shortcut_members', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'groups', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('shortcut_members', kind: UpdateKind.delete)], + ), ]); } @@ -13487,6 +13985,29 @@ final class $$GroupsTableReferences manager.$state.copyWith(prefetchedData: cache), ); } + + static MultiTypedResultKey<$ShortcutMembersTable, List> + _shortcutMembersRefsTable(_$TwonlyDB db) => MultiTypedResultKey.fromTable( + db.shortcutMembers, + aliasName: $_aliasNameGenerator( + db.groups.groupId, + db.shortcutMembers.groupId, + ), + ); + + $$ShortcutMembersTableProcessedTableManager get shortcutMembersRefs { + final manager = + $$ShortcutMembersTableTableManager($_db, $_db.shortcutMembers).filter( + (f) => f.groupId.groupId.sqlEquals($_itemColumn('group_id')!), + ); + + final cache = $_typedResult.readTableOrNull( + _shortcutMembersRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } } class $$GroupsTableFilterComposer extends Composer<_$TwonlyDB, $GroupsTable> { @@ -13696,6 +14217,31 @@ class $$GroupsTableFilterComposer extends Composer<_$TwonlyDB, $GroupsTable> { ); return f(composer); } + + Expression shortcutMembersRefs( + Expression Function($$ShortcutMembersTableFilterComposer f) f, + ) { + final $$ShortcutMembersTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.groupId, + referencedTable: $db.shortcutMembers, + getReferencedColumn: (t) => t.groupId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ShortcutMembersTableFilterComposer( + $db: $db, + $table: $db.shortcutMembers, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } } class $$GroupsTableOrderingComposer extends Composer<_$TwonlyDB, $GroupsTable> { @@ -14030,6 +14576,31 @@ class $$GroupsTableAnnotationComposer ); return f(composer); } + + Expression shortcutMembersRefs( + Expression Function($$ShortcutMembersTableAnnotationComposer a) f, + ) { + final $$ShortcutMembersTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.groupId, + referencedTable: $db.shortcutMembers, + getReferencedColumn: (t) => t.groupId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ShortcutMembersTableAnnotationComposer( + $db: $db, + $table: $db.shortcutMembers, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } } class $$GroupsTableTableManager @@ -14049,6 +14620,7 @@ class $$GroupsTableTableManager bool messagesRefs, bool groupMembersRefs, bool groupHistoriesRefs, + bool shortcutMembersRefs, }) > { $$GroupsTableTableManager(_$TwonlyDB db, $GroupsTable table) @@ -14189,6 +14761,7 @@ class $$GroupsTableTableManager messagesRefs = false, groupMembersRefs = false, groupHistoriesRefs = false, + shortcutMembersRefs = false, }) { return PrefetchHooks( db: db, @@ -14196,6 +14769,7 @@ class $$GroupsTableTableManager if (messagesRefs) db.messages, if (groupMembersRefs) db.groupMembers, if (groupHistoriesRefs) db.groupHistories, + if (shortcutMembersRefs) db.shortcutMembers, ], addJoins: null, getPrefetchedDataCallback: (items) async { @@ -14259,6 +14833,27 @@ class $$GroupsTableTableManager ), typedResults: items, ), + if (shortcutMembersRefs) + await $_getPrefetchedData< + Group, + $GroupsTable, + ShortcutMember + >( + currentTable: table, + referencedTable: $$GroupsTableReferences + ._shortcutMembersRefsTable(db), + managerFromTypedResult: (p0) => + $$GroupsTableReferences( + db, + table, + p0, + ).shortcutMembersRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.groupId == item.groupId, + ), + typedResults: items, + ), ]; }, ); @@ -14283,6 +14878,7 @@ typedef $$GroupsTableProcessedTableManager = bool messagesRefs, bool groupMembersRefs, bool groupHistoriesRefs, + bool shortcutMembersRefs, }) >; typedef $$MediaFilesTableCreateCompanionBuilder = @@ -21859,6 +22455,629 @@ typedef $$UserDiscoverySharesTableProcessedTableManager = UserDiscoveryShare, PrefetchHooks Function({bool contactId}) >; +typedef $$ShortcutsTableCreateCompanionBuilder = + ShortcutsCompanion Function({ + Value id, + required String emoji, + Value usageCounter, + }); +typedef $$ShortcutsTableUpdateCompanionBuilder = + ShortcutsCompanion Function({ + Value id, + Value emoji, + Value usageCounter, + }); + +final class $$ShortcutsTableReferences + extends BaseReferences<_$TwonlyDB, $ShortcutsTable, Shortcut> { + $$ShortcutsTableReferences(super.$_db, super.$_table, super.$_typedResult); + + static MultiTypedResultKey<$ShortcutMembersTable, List> + _shortcutMembersRefsTable(_$TwonlyDB db) => MultiTypedResultKey.fromTable( + db.shortcutMembers, + aliasName: $_aliasNameGenerator( + db.shortcuts.id, + db.shortcutMembers.shortcutId, + ), + ); + + $$ShortcutMembersTableProcessedTableManager get shortcutMembersRefs { + final manager = $$ShortcutMembersTableTableManager( + $_db, + $_db.shortcutMembers, + ).filter((f) => f.shortcutId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull( + _shortcutMembersRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } +} + +class $$ShortcutsTableFilterComposer + extends Composer<_$TwonlyDB, $ShortcutsTable> { + $$ShortcutsTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get emoji => $composableBuilder( + column: $table.emoji, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get usageCounter => $composableBuilder( + column: $table.usageCounter, + builder: (column) => ColumnFilters(column), + ); + + Expression shortcutMembersRefs( + Expression Function($$ShortcutMembersTableFilterComposer f) f, + ) { + final $$ShortcutMembersTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.shortcutMembers, + getReferencedColumn: (t) => t.shortcutId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ShortcutMembersTableFilterComposer( + $db: $db, + $table: $db.shortcutMembers, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$ShortcutsTableOrderingComposer + extends Composer<_$TwonlyDB, $ShortcutsTable> { + $$ShortcutsTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get emoji => $composableBuilder( + column: $table.emoji, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get usageCounter => $composableBuilder( + column: $table.usageCounter, + builder: (column) => ColumnOrderings(column), + ); +} + +class $$ShortcutsTableAnnotationComposer + extends Composer<_$TwonlyDB, $ShortcutsTable> { + $$ShortcutsTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get emoji => + $composableBuilder(column: $table.emoji, builder: (column) => column); + + GeneratedColumn get usageCounter => $composableBuilder( + column: $table.usageCounter, + builder: (column) => column, + ); + + Expression shortcutMembersRefs( + Expression Function($$ShortcutMembersTableAnnotationComposer a) f, + ) { + final $$ShortcutMembersTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.shortcutMembers, + getReferencedColumn: (t) => t.shortcutId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ShortcutMembersTableAnnotationComposer( + $db: $db, + $table: $db.shortcutMembers, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$ShortcutsTableTableManager + extends + RootTableManager< + _$TwonlyDB, + $ShortcutsTable, + Shortcut, + $$ShortcutsTableFilterComposer, + $$ShortcutsTableOrderingComposer, + $$ShortcutsTableAnnotationComposer, + $$ShortcutsTableCreateCompanionBuilder, + $$ShortcutsTableUpdateCompanionBuilder, + (Shortcut, $$ShortcutsTableReferences), + Shortcut, + PrefetchHooks Function({bool shortcutMembersRefs}) + > { + $$ShortcutsTableTableManager(_$TwonlyDB db, $ShortcutsTable table) + : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$ShortcutsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$ShortcutsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$ShortcutsTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value emoji = const Value.absent(), + Value usageCounter = const Value.absent(), + }) => ShortcutsCompanion( + id: id, + emoji: emoji, + usageCounter: usageCounter, + ), + createCompanionCallback: + ({ + Value id = const Value.absent(), + required String emoji, + Value usageCounter = const Value.absent(), + }) => ShortcutsCompanion.insert( + id: id, + emoji: emoji, + usageCounter: usageCounter, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$ShortcutsTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: ({shortcutMembersRefs = false}) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [ + if (shortcutMembersRefs) db.shortcutMembers, + ], + addJoins: null, + getPrefetchedDataCallback: (items) async { + return [ + if (shortcutMembersRefs) + await $_getPrefetchedData< + Shortcut, + $ShortcutsTable, + ShortcutMember + >( + currentTable: table, + referencedTable: $$ShortcutsTableReferences + ._shortcutMembersRefsTable(db), + managerFromTypedResult: (p0) => + $$ShortcutsTableReferences( + db, + table, + p0, + ).shortcutMembersRefs, + referencedItemsForCurrentItem: (item, referencedItems) => + referencedItems.where((e) => e.shortcutId == item.id), + typedResults: items, + ), + ]; + }, + ); + }, + ), + ); +} + +typedef $$ShortcutsTableProcessedTableManager = + ProcessedTableManager< + _$TwonlyDB, + $ShortcutsTable, + Shortcut, + $$ShortcutsTableFilterComposer, + $$ShortcutsTableOrderingComposer, + $$ShortcutsTableAnnotationComposer, + $$ShortcutsTableCreateCompanionBuilder, + $$ShortcutsTableUpdateCompanionBuilder, + (Shortcut, $$ShortcutsTableReferences), + Shortcut, + PrefetchHooks Function({bool shortcutMembersRefs}) + >; +typedef $$ShortcutMembersTableCreateCompanionBuilder = + ShortcutMembersCompanion Function({ + required int shortcutId, + required String groupId, + Value rowid, + }); +typedef $$ShortcutMembersTableUpdateCompanionBuilder = + ShortcutMembersCompanion Function({ + Value shortcutId, + Value groupId, + Value rowid, + }); + +final class $$ShortcutMembersTableReferences + extends BaseReferences<_$TwonlyDB, $ShortcutMembersTable, ShortcutMember> { + $$ShortcutMembersTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); + + static $ShortcutsTable _shortcutIdTable(_$TwonlyDB db) => + db.shortcuts.createAlias( + $_aliasNameGenerator(db.shortcutMembers.shortcutId, db.shortcuts.id), + ); + + $$ShortcutsTableProcessedTableManager get shortcutId { + final $_column = $_itemColumn('shortcut_id')!; + + final manager = $$ShortcutsTableTableManager( + $_db, + $_db.shortcuts, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_shortcutIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } + + static $GroupsTable _groupIdTable(_$TwonlyDB db) => db.groups.createAlias( + $_aliasNameGenerator(db.shortcutMembers.groupId, db.groups.groupId), + ); + + $$GroupsTableProcessedTableManager get groupId { + final $_column = $_itemColumn('group_id')!; + + final manager = $$GroupsTableTableManager( + $_db, + $_db.groups, + ).filter((f) => f.groupId.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_groupIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } +} + +class $$ShortcutMembersTableFilterComposer + extends Composer<_$TwonlyDB, $ShortcutMembersTable> { + $$ShortcutMembersTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + $$ShortcutsTableFilterComposer get shortcutId { + final $$ShortcutsTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.shortcutId, + referencedTable: $db.shortcuts, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ShortcutsTableFilterComposer( + $db: $db, + $table: $db.shortcuts, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$GroupsTableFilterComposer get groupId { + final $$GroupsTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.groupId, + referencedTable: $db.groups, + getReferencedColumn: (t) => t.groupId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$GroupsTableFilterComposer( + $db: $db, + $table: $db.groups, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ShortcutMembersTableOrderingComposer + extends Composer<_$TwonlyDB, $ShortcutMembersTable> { + $$ShortcutMembersTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + $$ShortcutsTableOrderingComposer get shortcutId { + final $$ShortcutsTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.shortcutId, + referencedTable: $db.shortcuts, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ShortcutsTableOrderingComposer( + $db: $db, + $table: $db.shortcuts, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$GroupsTableOrderingComposer get groupId { + final $$GroupsTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.groupId, + referencedTable: $db.groups, + getReferencedColumn: (t) => t.groupId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$GroupsTableOrderingComposer( + $db: $db, + $table: $db.groups, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ShortcutMembersTableAnnotationComposer + extends Composer<_$TwonlyDB, $ShortcutMembersTable> { + $$ShortcutMembersTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + $$ShortcutsTableAnnotationComposer get shortcutId { + final $$ShortcutsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.shortcutId, + referencedTable: $db.shortcuts, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ShortcutsTableAnnotationComposer( + $db: $db, + $table: $db.shortcuts, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$GroupsTableAnnotationComposer get groupId { + final $$GroupsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.groupId, + referencedTable: $db.groups, + getReferencedColumn: (t) => t.groupId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$GroupsTableAnnotationComposer( + $db: $db, + $table: $db.groups, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ShortcutMembersTableTableManager + extends + RootTableManager< + _$TwonlyDB, + $ShortcutMembersTable, + ShortcutMember, + $$ShortcutMembersTableFilterComposer, + $$ShortcutMembersTableOrderingComposer, + $$ShortcutMembersTableAnnotationComposer, + $$ShortcutMembersTableCreateCompanionBuilder, + $$ShortcutMembersTableUpdateCompanionBuilder, + (ShortcutMember, $$ShortcutMembersTableReferences), + ShortcutMember, + PrefetchHooks Function({bool shortcutId, bool groupId}) + > { + $$ShortcutMembersTableTableManager(_$TwonlyDB db, $ShortcutMembersTable table) + : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$ShortcutMembersTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$ShortcutMembersTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$ShortcutMembersTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value shortcutId = const Value.absent(), + Value groupId = const Value.absent(), + Value rowid = const Value.absent(), + }) => ShortcutMembersCompanion( + shortcutId: shortcutId, + groupId: groupId, + rowid: rowid, + ), + createCompanionCallback: + ({ + required int shortcutId, + required String groupId, + Value rowid = const Value.absent(), + }) => ShortcutMembersCompanion.insert( + shortcutId: shortcutId, + groupId: groupId, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$ShortcutMembersTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: ({shortcutId = false, groupId = false}) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [], + addJoins: + < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic + > + >(state) { + if (shortcutId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.shortcutId, + referencedTable: + $$ShortcutMembersTableReferences + ._shortcutIdTable(db), + referencedColumn: + $$ShortcutMembersTableReferences + ._shortcutIdTable(db) + .id, + ) + as T; + } + if (groupId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.groupId, + referencedTable: + $$ShortcutMembersTableReferences + ._groupIdTable(db), + referencedColumn: + $$ShortcutMembersTableReferences + ._groupIdTable(db) + .groupId, + ) + as T; + } + + return state; + }, + getPrefetchedDataCallback: (items) async { + return []; + }, + ); + }, + ), + ); +} + +typedef $$ShortcutMembersTableProcessedTableManager = + ProcessedTableManager< + _$TwonlyDB, + $ShortcutMembersTable, + ShortcutMember, + $$ShortcutMembersTableFilterComposer, + $$ShortcutMembersTableOrderingComposer, + $$ShortcutMembersTableAnnotationComposer, + $$ShortcutMembersTableCreateCompanionBuilder, + $$ShortcutMembersTableUpdateCompanionBuilder, + (ShortcutMember, $$ShortcutMembersTableReferences), + ShortcutMember, + PrefetchHooks Function({bool shortcutId, bool groupId}) + >; class $TwonlyDBManager { final _$TwonlyDB _db; @@ -21926,4 +23145,8 @@ class $TwonlyDBManager { ); $$UserDiscoverySharesTableTableManager get userDiscoveryShares => $$UserDiscoverySharesTableTableManager(_db, _db.userDiscoveryShares); + $$ShortcutsTableTableManager get shortcuts => + $$ShortcutsTableTableManager(_db, _db.shortcuts); + $$ShortcutMembersTableTableManager get shortcutMembers => + $$ShortcutMembersTableTableManager(_db, _db.shortcutMembers); } diff --git a/lib/src/database/twonly.db.steps.dart b/lib/src/database/twonly.db.steps.dart index 4f8306bc..54bf66ee 100644 --- a/lib/src/database/twonly.db.steps.dart +++ b/lib/src/database/twonly.db.steps.dart @@ -6582,6 +6582,480 @@ i1.GeneratedColumn _column_235(String aliasedName) => type: i1.DriftSqlType.blob, $customConstraints: 'NOT NULL', ); + +final class Schema13 extends i0.VersionedSchema { + Schema13({required super.database}) : super(version: 13); + @override + late final List entities = [ + contacts, + groups, + mediaFiles, + messages, + messageHistories, + reactions, + groupMembers, + receipts, + receivedReceipts, + signalIdentityKeyStores, + signalPreKeyStores, + signalSenderKeyStores, + signalSessionStores, + messageActions, + groupHistories, + keyVerifications, + verificationTokens, + userDiscoveryAnnouncedUsers, + userDiscoveryUserRelations, + userDiscoveryOtherPromotions, + userDiscoveryOwnPromotions, + userDiscoveryShares, + shortcuts, + shortcutMembers, + ]; + late final Shape39 contacts = Shape39( + source: i0.VersionedTable( + entityName: 'contacts', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(user_id)'], + columns: [ + _column_106, + _column_107, + _column_108, + _column_109, + _column_110, + _column_111, + _column_112, + _column_113, + _column_114, + _column_115, + _column_116, + _column_117, + _column_118, + _column_211, + _column_212, + _column_213, + _column_214, + _column_215, + ], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape23 groups = Shape23( + source: i0.VersionedTable( + entityName: 'groups', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(group_id)'], + columns: [ + _column_119, + _column_120, + _column_121, + _column_122, + _column_123, + _column_124, + _column_125, + _column_126, + _column_127, + _column_128, + _column_129, + _column_130, + _column_131, + _column_132, + _column_133, + _column_134, + _column_118, + _column_135, + _column_136, + _column_137, + _column_138, + _column_139, + _column_140, + _column_141, + _column_142, + ], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape36 mediaFiles = Shape36( + source: i0.VersionedTable( + entityName: 'media_files', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(media_id)'], + columns: [ + _column_143, + _column_144, + _column_145, + _column_146, + _column_147, + _column_148, + _column_149, + _column_207, + _column_150, + _column_151, + _column_152, + _column_153, + _column_154, + _column_155, + _column_156, + _column_157, + _column_118, + ], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape25 messages = Shape25( + source: i0.VersionedTable( + entityName: 'messages', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(message_id)'], + columns: [ + _column_158, + _column_159, + _column_160, + _column_144, + _column_161, + _column_162, + _column_163, + _column_164, + _column_165, + _column_153, + _column_166, + _column_167, + _column_168, + _column_169, + _column_118, + _column_170, + _column_171, + _column_172, + ], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape26 messageHistories = Shape26( + source: i0.VersionedTable( + entityName: 'message_histories', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_173, + _column_174, + _column_175, + _column_161, + _column_118, + ], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape27 reactions = Shape27( + source: i0.VersionedTable( + entityName: 'reactions', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(message_id, sender_id, emoji)'], + columns: [_column_174, _column_176, _column_177, _column_118], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape38 groupMembers = Shape38( + source: i0.VersionedTable( + entityName: 'group_members', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(group_id, contact_id)'], + columns: [ + _column_158, + _column_178, + _column_179, + _column_180, + _column_209, + _column_210, + _column_181, + _column_118, + ], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape37 receipts = Shape37( + source: i0.VersionedTable( + entityName: 'receipts', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(receipt_id)'], + columns: [ + _column_182, + _column_183, + _column_184, + _column_185, + _column_186, + _column_208, + _column_187, + _column_188, + _column_189, + _column_190, + _column_191, + _column_118, + ], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape30 receivedReceipts = Shape30( + source: i0.VersionedTable( + entityName: 'received_receipts', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(receipt_id)'], + columns: [_column_182, _column_118], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape31 signalIdentityKeyStores = Shape31( + source: i0.VersionedTable( + entityName: 'signal_identity_key_stores', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(device_id, name)'], + columns: [_column_192, _column_193, _column_194, _column_118], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape32 signalPreKeyStores = Shape32( + source: i0.VersionedTable( + entityName: 'signal_pre_key_stores', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(pre_key_id)'], + columns: [_column_195, _column_196, _column_118], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape11 signalSenderKeyStores = Shape11( + source: i0.VersionedTable( + entityName: 'signal_sender_key_stores', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(sender_key_name)'], + columns: [_column_197, _column_198], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape33 signalSessionStores = Shape33( + source: i0.VersionedTable( + entityName: 'signal_session_stores', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(device_id, name)'], + columns: [_column_192, _column_193, _column_199, _column_118], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape34 messageActions = Shape34( + source: i0.VersionedTable( + entityName: 'message_actions', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(message_id, contact_id, type)'], + columns: [_column_174, _column_183, _column_144, _column_200], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape35 groupHistories = Shape35( + source: i0.VersionedTable( + entityName: 'group_histories', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(group_history_id)'], + columns: [ + _column_201, + _column_158, + _column_202, + _column_203, + _column_204, + _column_205, + _column_206, + _column_144, + _column_200, + ], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape40 keyVerifications = Shape40( + source: i0.VersionedTable( + entityName: 'key_verifications', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [_column_216, _column_183, _column_144, _column_118], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape41 verificationTokens = Shape41( + source: i0.VersionedTable( + entityName: 'verification_tokens', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [_column_217, _column_218, _column_118], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape42 userDiscoveryAnnouncedUsers = Shape42( + source: i0.VersionedTable( + entityName: 'user_discovery_announced_users', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(announced_user_id)'], + columns: [ + _column_219, + _column_220, + _column_221, + _column_222, + _column_223, + _column_224, + ], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape43 userDiscoveryUserRelations = Shape43( + source: i0.VersionedTable( + entityName: 'user_discovery_user_relations', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(announced_user_id, from_contact_id)'], + columns: [_column_225, _column_226, _column_227], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape44 userDiscoveryOtherPromotions = Shape44( + source: i0.VersionedTable( + entityName: 'user_discovery_other_promotions', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(from_contact_id, public_id)'], + columns: [ + _column_226, + _column_228, + _column_229, + _column_230, + _column_231, + _column_227, + ], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape45 userDiscoveryOwnPromotions = Shape45( + source: i0.VersionedTable( + entityName: 'user_discovery_own_promotions', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [_column_232, _column_183, _column_233], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape46 userDiscoveryShares = Shape46( + source: i0.VersionedTable( + entityName: 'user_discovery_shares', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [_column_234, _column_235, _column_175], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape47 shortcuts = Shape47( + source: i0.VersionedTable( + entityName: 'shortcuts', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [_column_173, _column_236, _column_237], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape48 shortcutMembers = Shape48( + source: i0.VersionedTable( + entityName: 'shortcut_members', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(shortcut_id, group_id)'], + columns: [_column_238, _column_158], + attachedDatabase: database, + ), + alias: null, + ); +} + +class Shape47 extends i0.VersionedTable { + Shape47({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get emoji => + columnsByName['emoji']! as i1.GeneratedColumn; + i1.GeneratedColumn get usageCounter => + columnsByName['usage_counter']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_236(String aliasedName) => + i1.GeneratedColumn( + 'emoji', + aliasedName, + false, + type: i1.DriftSqlType.string, + $customConstraints: 'NOT NULL UNIQUE', + ); +i1.GeneratedColumn _column_237(String aliasedName) => + i1.GeneratedColumn( + 'usage_counter', + aliasedName, + false, + type: i1.DriftSqlType.int, + $customConstraints: 'NOT NULL DEFAULT 0', + defaultValue: const i1.CustomExpression('0'), + ); + +class Shape48 extends i0.VersionedTable { + Shape48({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get shortcutId => + columnsByName['shortcut_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get groupId => + columnsByName['group_id']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_238(String aliasedName) => + i1.GeneratedColumn( + 'shortcut_id', + aliasedName, + false, + type: i1.DriftSqlType.int, + $customConstraints: 'NOT NULL REFERENCES shortcuts(id)ON DELETE CASCADE', + ); i0.MigrationStepWithVersion migrationSteps({ required Future Function(i1.Migrator m, Schema2 schema) from1To2, required Future Function(i1.Migrator m, Schema3 schema) from2To3, @@ -6594,6 +7068,7 @@ i0.MigrationStepWithVersion migrationSteps({ required Future Function(i1.Migrator m, Schema10 schema) from9To10, required Future Function(i1.Migrator m, Schema11 schema) from10To11, required Future Function(i1.Migrator m, Schema12 schema) from11To12, + required Future Function(i1.Migrator m, Schema13 schema) from12To13, }) { return (currentVersion, database) async { switch (currentVersion) { @@ -6652,6 +7127,11 @@ i0.MigrationStepWithVersion migrationSteps({ final migrator = i1.Migrator(database, schema); await from11To12(migrator, schema); return 12; + case 12: + final schema = Schema13(database: database); + final migrator = i1.Migrator(database, schema); + await from12To13(migrator, schema); + return 13; default: throw ArgumentError.value('Unknown migration from $currentVersion'); } @@ -6670,6 +7150,7 @@ i1.OnUpgrade stepByStep({ required Future Function(i1.Migrator m, Schema10 schema) from9To10, required Future Function(i1.Migrator m, Schema11 schema) from10To11, required Future Function(i1.Migrator m, Schema12 schema) from11To12, + required Future Function(i1.Migrator m, Schema13 schema) from12To13, }) => i0.VersionedSchema.stepByStepHelper( step: migrationSteps( from1To2: from1To2, @@ -6683,5 +7164,6 @@ i1.OnUpgrade stepByStep({ from9To10: from9To10, from10To11: from10To11, from11To12: from11To12, + from12To13: from12To13, ), ); diff --git a/lib/src/localization/generated/app_localizations.dart b/lib/src/localization/generated/app_localizations.dart index 8684ef56..aa0a86f0 100644 --- a/lib/src/localization/generated/app_localizations.dart +++ b/lib/src/localization/generated/app_localizations.dart @@ -3115,6 +3115,48 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'Registering new account'** String get registeringNewAccount; + + /// No description provided for @createShortcut. + /// + /// In en, this message translates to: + /// **'Create shortcut'** + String get createShortcut; + + /// No description provided for @editShortcut. + /// + /// In en, this message translates to: + /// **'Edit shortcut'** + String get editShortcut; + + /// No description provided for @deleteShortcut. + /// + /// In en, this message translates to: + /// **'Delete shortcut'** + String get deleteShortcut; + + /// No description provided for @deleteShortcutBody. + /// + /// In en, this message translates to: + /// **'Are you sure you want to delete this shortcut?'** + String get deleteShortcutBody; + + /// No description provided for @updateShortcut. + /// + /// In en, this message translates to: + /// **'Update shortcut'** + String get updateShortcut; + + /// No description provided for @selectEmoji. + /// + /// In en, this message translates to: + /// **'Select Emoji'** + String get selectEmoji; + + /// No description provided for @errorEmojiUsedOrInvalid. + /// + /// In en, this message translates to: + /// **'Emoji already used or invalid'** + String get errorEmojiUsedOrInvalid; } class _AppLocalizationsDelegate diff --git a/lib/src/localization/generated/app_localizations_de.dart b/lib/src/localization/generated/app_localizations_de.dart index db292824..2f155db8 100644 --- a/lib/src/localization/generated/app_localizations_de.dart +++ b/lib/src/localization/generated/app_localizations_de.dart @@ -1757,4 +1757,27 @@ class AppLocalizationsDe extends AppLocalizations { @override String get registeringNewAccount => 'Neues Konto wird registriert'; + + @override + String get createShortcut => 'Shortcut erstellen'; + + @override + String get editShortcut => 'Shortcut bearbeiten'; + + @override + String get deleteShortcut => 'Shortcut löschen'; + + @override + String get deleteShortcutBody => + 'Bist du sicher, dass du diesen Shortcut löschen möchtest?'; + + @override + String get updateShortcut => 'Shortcut aktualisieren'; + + @override + String get selectEmoji => 'Emoji auswählen'; + + @override + String get errorEmojiUsedOrInvalid => + 'Emoji wird bereits verwendet oder ist ungültig'; } diff --git a/lib/src/localization/generated/app_localizations_en.dart b/lib/src/localization/generated/app_localizations_en.dart index 7bd2a28f..330e9c77 100644 --- a/lib/src/localization/generated/app_localizations_en.dart +++ b/lib/src/localization/generated/app_localizations_en.dart @@ -1742,4 +1742,26 @@ class AppLocalizationsEn extends AppLocalizations { @override String get registeringNewAccount => 'Registering new account'; + + @override + String get createShortcut => 'Create shortcut'; + + @override + String get editShortcut => 'Edit shortcut'; + + @override + String get deleteShortcut => 'Delete shortcut'; + + @override + String get deleteShortcutBody => + 'Are you sure you want to delete this shortcut?'; + + @override + String get updateShortcut => 'Update shortcut'; + + @override + String get selectEmoji => 'Select Emoji'; + + @override + String get errorEmojiUsedOrInvalid => 'Emoji already used or invalid'; } diff --git a/lib/src/localization/translations b/lib/src/localization/translations index 75b97e91..9218abf0 160000 --- a/lib/src/localization/translations +++ b/lib/src/localization/translations @@ -1 +1 @@ -Subproject commit 75b97e912f2e72a8e2a5da65e8ad12f0d1091855 +Subproject commit 9218abf0961c072edd2f8aa5035d06a331b853c6 diff --git a/lib/src/services/api.service.dart b/lib/src/services/api.service.dart index 035a6e02..3e0637e2 100644 --- a/lib/src/services/api.service.dart +++ b/lib/src/services/api.service.dart @@ -417,6 +417,7 @@ class ApiService { ), ); } + await twonlyDB.receiptsDao.deleteReceiptForUser(contactId); } } return res; diff --git a/lib/src/services/mediafiles/thumbnail.service.dart b/lib/src/services/mediafiles/thumbnail.service.dart index c6c0d81d..9f8f2b75 100644 --- a/lib/src/services/mediafiles/thumbnail.service.dart +++ b/lib/src/services/mediafiles/thumbnail.service.dart @@ -31,7 +31,7 @@ Future createThumbnailsForVideo( 'It took ${stopwatch.elapsedMilliseconds}ms to create the thumbnail.', ); } else { - Log.error( + Log.warn( 'Thumbnail creation failed for the video with exit code.', ); } diff --git a/lib/src/utils/log.dart b/lib/src/utils/log.dart index 22f3ec94..ae44ca31 100644 --- a/lib/src/utils/log.dart +++ b/lib/src/utils/log.dart @@ -29,7 +29,10 @@ class Log { static String filterLogMessage(String msg) { if (msg.contains('SqliteException')) { // Do not log data which would be inserted into the DB. - return msg.substring(0, msg.indexOf('parameters: ')); + final paramIndex = msg.indexOf('parameters: '); + if (paramIndex != -1) { + return msg.substring(0, paramIndex); + } } return msg; } diff --git a/lib/src/visual/components/animate_icon.comp.dart b/lib/src/visual/components/animate_icon.comp.dart index 3f2edc9e..7420fb3c 100644 --- a/lib/src/visual/components/animate_icon.comp.dart +++ b/lib/src/visual/components/animate_icon.comp.dart @@ -82,6 +82,7 @@ class EmojiAnimationComp extends StatelessWidget { '😴': 'sleep.lottie', '🤒': 'thermometer-face.lottie', '🤕': 'bandage-face.lottie', + '🫪': 'distorted_face.json', '🤥': 'liar.lottie', '😇': 'halo.lottie', '🤠': 'cowboy.lottie', diff --git a/lib/src/visual/views/camera/add_new_shortcut.view.dart b/lib/src/visual/views/camera/add_new_shortcut.view.dart new file mode 100644 index 00000000..11a611e4 --- /dev/null +++ b/lib/src/visual/views/camera/add_new_shortcut.view.dart @@ -0,0 +1,292 @@ +import 'dart:async'; +import 'dart:collection'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:twonly/locator.dart'; +import 'package:twonly/src/database/daos/contacts.dao.dart'; +import 'package:twonly/src/database/twonly.db.dart'; +import 'package:twonly/src/utils/log.dart'; +import 'package:twonly/src/utils/misc.dart'; +import 'package:twonly/src/visual/components/avatar_icon.comp.dart'; +import 'package:twonly/src/visual/components/emoji_picker.bottom.dart'; +import 'package:twonly/src/visual/components/flame_counter.comp.dart'; +import 'package:twonly/src/visual/components/snackbar.dart'; +import 'package:twonly/src/visual/decorations/input_text.decoration.dart'; +import 'package:twonly/src/visual/views/camera/share_image_editor_components/layer_data.dart'; + +class AddNewShortcutView extends StatefulWidget { + const AddNewShortcutView({this.shortcut, super.key}); + final Shortcut? shortcut; + @override + State createState() => _StartNewChatView(); +} + +class _StartNewChatView extends State { + List _groups = []; + List _allGroups = []; + final TextEditingController _searchGroupName = TextEditingController(); + late StreamSubscription> _groupSub; + + final HashSet _selectedGroups = HashSet(); + String? shortcutEmoji; + + @override + void initState() { + super.initState(); + + if (widget.shortcut != null) { + shortcutEmoji = widget.shortcut!.emoji; + twonlyDB.shortcutsDao.getShortcutMembers(widget.shortcut!.id).then(( + members, + ) { + if (mounted) { + setState(() { + for (final m in members) { + _selectedGroups.add(m.groupId); + } + }); + } + }); + } + + final stream = twonlyDB.groupsDao.watchGroupsForChatList(); + + _groupSub = stream.listen((update) async { + update.sort( + (a, b) => a.groupName.compareTo(b.groupName), + ); + setState(() { + _allGroups = update; + }); + await filterUsers(); + }); + } + + @override + void dispose() { + unawaited(_groupSub.cancel()); + super.dispose(); + } + + Future filterUsers() async { + if (_searchGroupName.value.text.isEmpty) { + setState(() { + _groups = _allGroups; + }); + return; + } + final usersFiltered = _allGroups + .where( + (group) => group.groupName.toLowerCase().contains( + _searchGroupName.value.text.toLowerCase(), + ), + ) + .toList(); + setState(() { + _groups = usersFiltered; + }); + } + + void toggleSelectedGroup(String groupId) { + if (!_selectedGroups.contains(groupId)) { + if (_selectedGroups.length > 256) { + showSnackbar(context, context.lang.groupSizeLimitError(256)); + return; + } + _selectedGroups.add(groupId); + } else { + _selectedGroups.remove(groupId); + } + setState(() {}); + } + + Future submitChanges() async { + try { + if (widget.shortcut != null) { + await twonlyDB.shortcutsDao.updateShortcut( + widget.shortcut!.id, + shortcutEmoji!, + ); + await twonlyDB.shortcutsDao.deleteShortcutMembers(widget.shortcut!.id); + await twonlyDB.shortcutsDao.addShortcutMembers( + widget.shortcut!.id, + _selectedGroups.toList(), + ); + } else { + await twonlyDB.shortcutsDao.createShortcut( + shortcutEmoji!, + ); + final shortcutId = (await twonlyDB.shortcutsDao.getShortcutByEmoji( + shortcutEmoji!, + ))!.id; + await twonlyDB.shortcutsDao.deleteShortcutMembers(shortcutId); + await twonlyDB.shortcutsDao.addShortcutMembers( + shortcutId, + _selectedGroups.toList(), + ); + } + if (mounted) Navigator.pop(context); + } catch (e) { + Log.error(e); + if (mounted) { + showSnackbar(context, context.lang.errorEmojiUsedOrInvalid); + } + } + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => FocusScope.of(context).unfocus(), + child: Scaffold( + appBar: AppBar( + title: Text( + widget.shortcut == null + ? context.lang.createShortcut + : context.lang.editShortcut, + ), + actions: [ + if (widget.shortcut != null) + IconButton( + icon: const FaIcon( + FontAwesomeIcons.trashCan, + size: 18, + color: Colors.red, + ), + onPressed: () async { + final confirm = await showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text(context.lang.deleteShortcut), + content: Text(context.lang.deleteShortcutBody), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context, false), + child: Text(context.lang.cancel), + ), + FilledButton( + onPressed: () => Navigator.pop(context, true), + child: Text(context.lang.delete), + ), + ], + ), + ); + if (confirm == true) { + await twonlyDB.shortcutsDao.deleteShortcut( + widget.shortcut!.id, + ); + if (context.mounted) Navigator.pop(context); + } + }, + ), + TextButton( + onPressed: () async { + // ignore: inference_failure_on_function_invocation + final result = await showModalBottomSheet( + context: context, + backgroundColor: Colors.black, + builder: (context) => const EmojiPickerBottom(), + ); + if (result is EmojiLayerData) { + setState(() { + shortcutEmoji = result.text; + }); + } + }, + child: Text( + shortcutEmoji ?? context.lang.selectEmoji, + style: TextStyle( + fontSize: shortcutEmoji == null ? 14 : 22, + ), + ), + ), + const SizedBox(width: 8), + ], + ), + floatingActionButton: FilledButton.icon( + onPressed: (_selectedGroups.isEmpty || shortcutEmoji == null) + ? null + : submitChanges, + label: Text( + widget.shortcut == null + ? context.lang.createShortcut + : context.lang.updateShortcut, + ), + icon: const FaIcon(FontAwesomeIcons.check), + ), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.only( + bottom: 40, + left: 10, + top: 20, + right: 10, + ), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: TextField( + onChanged: (_) async { + await filterUsers(); + }, + controller: _searchGroupName, + decoration: getInputDecoration( + context, + context.lang.shareImageSearchAllContacts, + ), + ), + ), + const SizedBox(height: 10), + Expanded( + child: ListView.builder( + restorationId: 'new_message_users_list', + itemCount: _groups.length, + itemBuilder: (context, i) { + final group = _groups[i]; + return ListTile( + key: ValueKey(group.groupId), + title: Row( + children: [ + Text(substringBy(group.groupName, 12)), + FlameCounterWidget( + groupId: group.groupId, + prefix: true, + ), + ], + ), + leading: AvatarIcon( + group: group, + fontSize: 15, + ), + trailing: Checkbox( + value: _selectedGroups.contains(group.groupId), + side: WidgetStateBorderSide.resolveWith( + (states) { + if (states.contains(WidgetState.selected)) { + return const BorderSide(width: 0); + } + return BorderSide( + color: Theme.of(context).colorScheme.outline, + ); + }, + ), + onChanged: (value) { + toggleSelectedGroup(group.groupId); + }, + ), + onTap: () { + toggleSelectedGroup(group.groupId); + }, + ); + }, + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/src/visual/views/camera/camera_preview_components/main_camera_controller.dart b/lib/src/visual/views/camera/camera_preview_components/main_camera_controller.dart index b4737964..92c9ebf9 100644 --- a/lib/src/visual/views/camera/camera_preview_components/main_camera_controller.dart +++ b/lib/src/visual/views/camera/camera_preview_components/main_camera_controller.dart @@ -98,9 +98,12 @@ class MainCameraController { final cameraControllerTemp = cameraController; cameraController = null; // prevents: CameraException(Disposed CameraController, buildPreview() was called on a disposed CameraController.) - _pendingDisposal = Future.delayed(const Duration(milliseconds: 100), () async { - await cameraControllerTemp?.dispose(); - }); + _pendingDisposal = Future.delayed( + const Duration(milliseconds: 100), + () async { + await cameraControllerTemp?.dispose(); + }, + ); initCameraStarted = false; selectedCameraDetails = SelectedCameraDetails(); } @@ -226,7 +229,7 @@ class MainCameraController { (e.code == 'setFocusPointFailed' || e.code == 'setFocusModeFailed')) { Log.info('Focus point or mode not supported on this device'); } else { - Log.error(e); + Log.warn(e); } } diff --git a/lib/src/visual/views/camera/share_image_contact_selection.view.dart b/lib/src/visual/views/camera/share_image_contact_selection.view.dart index 74433e08..318fd5a6 100644 --- a/lib/src/visual/views/camera/share_image_contact_selection.view.dart +++ b/lib/src/visual/views/camera/share_image_contact_selection.view.dart @@ -20,6 +20,7 @@ import 'package:twonly/src/visual/decorations/input_text.decoration.dart'; import 'package:twonly/src/visual/elements/headline.element.dart'; import 'package:twonly/src/visual/helpers/screenshot.helper.dart'; import 'package:twonly/src/visual/views/camera/share_image_contact_selection_components/best_friends_selector.dart'; +import 'package:twonly/src/visual/views/camera/share_image_contact_selection_components/shortcut_row.comp.dart'; import 'package:twonly/src/visual/views/camera/share_image_editor_components/layers/background.layer.dart'; class ShareImageView extends StatefulWidget { @@ -194,6 +195,11 @@ class _ShareImageView extends State { ), ), ), + const SizedBox(height: 10), + ShortcutRowComp( + selectedGroupIds: widget.selectedGroupIds, + updateSelectedGroupIds: updateSelectedGroupIds, + ), if (_pinnedContacts.isNotEmpty) const SizedBox(height: 10), BestFriendsSelector( groups: _pinnedContacts, diff --git a/lib/src/visual/views/camera/share_image_contact_selection_components/shortcut_row.comp.dart b/lib/src/visual/views/camera/share_image_contact_selection_components/shortcut_row.comp.dart new file mode 100644 index 00000000..4da1a065 --- /dev/null +++ b/lib/src/visual/views/camera/share_image_contact_selection_components/shortcut_row.comp.dart @@ -0,0 +1,82 @@ +import 'dart:collection'; +import 'package:flutter/material.dart'; +import 'package:twonly/locator.dart'; +import 'package:twonly/src/database/twonly.db.dart'; +import 'package:twonly/src/utils/misc.dart'; +import 'package:twonly/src/visual/views/camera/add_new_shortcut.view.dart'; + +class ShortcutRowComp extends StatefulWidget { + const ShortcutRowComp({ + required this.selectedGroupIds, + required this.updateSelectedGroupIds, + super.key, + }); + + final HashSet selectedGroupIds; + final void Function(String, bool) updateSelectedGroupIds; + + @override + State createState() => _ShortcutRowCompState(); +} + +class _ShortcutRowCompState extends State { + Future _openCreateDialog() async { + await context.navPush(const AddNewShortcutView()); + } + + Future _applyShortcut(Shortcut shortcut) async { + await twonlyDB.shortcutsDao.incrementUsage(shortcut.id); + final members = await twonlyDB.shortcutsDao.getShortcutMembers(shortcut.id); + for (final m in members) { + widget.updateSelectedGroupIds(m.groupId, true); + } + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 40, + child: StreamBuilder>( + stream: twonlyDB.shortcutsDao.watchAllShortcuts(), + builder: (context, snapshot) { + final shortcuts = snapshot.data ?? []; + return ListView( + scrollDirection: Axis.horizontal, + children: [ + Row( + children: [ + ActionChip( + padding: EdgeInsets.zero, + onPressed: _openCreateDialog, + label: shortcuts.isEmpty + ? Text( + context.lang.createShortcut, + style: const TextStyle(fontSize: 9), + ) + : const Icon(Icons.add_reaction_outlined, size: 20), + shape: const StadiumBorder(), + ), + for (final shortcut in shortcuts) + GestureDetector( + onLongPress: () { + context.navPush(AddNewShortcutView(shortcut: shortcut)); + }, + child: ActionChip( + padding: EdgeInsets.zero, + onPressed: () => _applyShortcut(shortcut), + label: Text( + shortcut.emoji, + style: const TextStyle(fontSize: 18), + ), + shape: const StadiumBorder(), + ), + ), + ], + ), + ], + ); + }, + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index fb45dac6..8b6957f8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -443,8 +443,8 @@ packages: dependency: "direct main" description: path: "." - ref: HEAD - resolved-ref: c5bffd3414c1e640389b41165b831df7df1cf517 + ref: "23a0595f7dde50728afce917c1c58f284ccbb495" + resolved-ref: "23a0595f7dde50728afce917c1c58f284ccbb495" url: "https://github.com/otsmr/emoji_picker_flutter.git" source: git version: "4.4.0" diff --git a/pubspec.yaml b/pubspec.yaml index 61a7d45b..777167af 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -167,6 +167,7 @@ dependency_overrides: # Using override until this gets merged. git: url: https://github.com/otsmr/emoji_picker_flutter.git + ref: 23a0595f7dde50728afce917c1c58f284ccbb495 flutter_android_volume_keydown: git: url: https://github.com/yenchieh/flutter_android_volume_keydown.git diff --git a/test/drift/twonly_db/generated/schema.dart b/test/drift/twonly_db/generated/schema.dart index 49f49d7b..ba56c197 100644 --- a/test/drift/twonly_db/generated/schema.dart +++ b/test/drift/twonly_db/generated/schema.dart @@ -16,6 +16,7 @@ import 'schema_v9.dart' as v9; import 'schema_v10.dart' as v10; import 'schema_v11.dart' as v11; import 'schema_v12.dart' as v12; +import 'schema_v13.dart' as v13; class GeneratedHelper implements SchemaInstantiationHelper { @override @@ -45,10 +46,12 @@ class GeneratedHelper implements SchemaInstantiationHelper { return v11.DatabaseAtV11(db); case 12: return v12.DatabaseAtV12(db); + case 13: + return v13.DatabaseAtV13(db); default: throw MissingSchemaException(version, versions); } } - static const versions = const [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; + static const versions = const [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; } diff --git a/test/drift/twonly_db/generated/schema_v13.dart b/test/drift/twonly_db/generated/schema_v13.dart index 4f14bd6f..42a936b7 100644 --- a/test/drift/twonly_db/generated/schema_v13.dart +++ b/test/drift/twonly_db/generated/schema_v13.dart @@ -135,6 +135,27 @@ class Contacts extends Table with TableInfo { requiredDuringInsert: false, $customConstraints: 'NULL', ); + late final GeneratedColumn userDiscoveryExcluded = GeneratedColumn( + 'user_discovery_excluded', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + $customConstraints: + 'NOT NULL DEFAULT 0 CHECK (user_discovery_excluded IN (0, 1))', + defaultValue: const CustomExpression('0'), + ); + late final GeneratedColumn userDiscoveryManualApproved = + GeneratedColumn( + 'user_discovery_manual_approved', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + $customConstraints: + 'NULL DEFAULT 0 CHECK (user_discovery_manual_approved IN (0, 1))', + defaultValue: const CustomExpression('0'), + ); late final GeneratedColumn mediaSendCounter = GeneratedColumn( 'media_send_counter', aliasedName, @@ -169,6 +190,8 @@ class Contacts extends Table with TableInfo { accountDeleted, createdAt, userDiscoveryVersion, + userDiscoveryExcluded, + userDiscoveryManualApproved, mediaSendCounter, mediaReceivedCounter, ]; @@ -239,6 +262,14 @@ class Contacts extends Table with TableInfo { DriftSqlType.blob, data['${effectivePrefix}user_discovery_version'], ), + userDiscoveryExcluded: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}user_discovery_excluded'], + )!, + userDiscoveryManualApproved: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}user_discovery_manual_approved'], + ), mediaSendCounter: attachedDatabase.typeMapping.read( DriftSqlType.int, data['${effectivePrefix}media_send_counter'], @@ -276,6 +307,8 @@ class ContactsData extends DataClass implements Insertable { final int accountDeleted; final int createdAt; final i2.Uint8List? userDiscoveryVersion; + final int userDiscoveryExcluded; + final int? userDiscoveryManualApproved; final int mediaSendCounter; final int mediaReceivedCounter; const ContactsData({ @@ -293,6 +326,8 @@ class ContactsData extends DataClass implements Insertable { required this.accountDeleted, required this.createdAt, this.userDiscoveryVersion, + required this.userDiscoveryExcluded, + this.userDiscoveryManualApproved, required this.mediaSendCounter, required this.mediaReceivedCounter, }); @@ -325,6 +360,12 @@ class ContactsData extends DataClass implements Insertable { userDiscoveryVersion, ); } + map['user_discovery_excluded'] = Variable(userDiscoveryExcluded); + if (!nullToAbsent || userDiscoveryManualApproved != null) { + map['user_discovery_manual_approved'] = Variable( + userDiscoveryManualApproved, + ); + } map['media_send_counter'] = Variable(mediaSendCounter); map['media_received_counter'] = Variable(mediaReceivedCounter); return map; @@ -354,6 +395,11 @@ class ContactsData extends DataClass implements Insertable { userDiscoveryVersion: userDiscoveryVersion == null && nullToAbsent ? const Value.absent() : Value(userDiscoveryVersion), + userDiscoveryExcluded: Value(userDiscoveryExcluded), + userDiscoveryManualApproved: + userDiscoveryManualApproved == null && nullToAbsent + ? const Value.absent() + : Value(userDiscoveryManualApproved), mediaSendCounter: Value(mediaSendCounter), mediaReceivedCounter: Value(mediaReceivedCounter), ); @@ -385,6 +431,12 @@ class ContactsData extends DataClass implements Insertable { userDiscoveryVersion: serializer.fromJson( json['userDiscoveryVersion'], ), + userDiscoveryExcluded: serializer.fromJson( + json['userDiscoveryExcluded'], + ), + userDiscoveryManualApproved: serializer.fromJson( + json['userDiscoveryManualApproved'], + ), mediaSendCounter: serializer.fromJson(json['mediaSendCounter']), mediaReceivedCounter: serializer.fromJson( json['mediaReceivedCounter'], @@ -413,6 +465,10 @@ class ContactsData extends DataClass implements Insertable { 'userDiscoveryVersion': serializer.toJson( userDiscoveryVersion, ), + 'userDiscoveryExcluded': serializer.toJson(userDiscoveryExcluded), + 'userDiscoveryManualApproved': serializer.toJson( + userDiscoveryManualApproved, + ), 'mediaSendCounter': serializer.toJson(mediaSendCounter), 'mediaReceivedCounter': serializer.toJson(mediaReceivedCounter), }; @@ -433,6 +489,8 @@ class ContactsData extends DataClass implements Insertable { int? accountDeleted, int? createdAt, Value userDiscoveryVersion = const Value.absent(), + int? userDiscoveryExcluded, + Value userDiscoveryManualApproved = const Value.absent(), int? mediaSendCounter, int? mediaReceivedCounter, }) => ContactsData( @@ -454,6 +512,10 @@ class ContactsData extends DataClass implements Insertable { userDiscoveryVersion: userDiscoveryVersion.present ? userDiscoveryVersion.value : this.userDiscoveryVersion, + userDiscoveryExcluded: userDiscoveryExcluded ?? this.userDiscoveryExcluded, + userDiscoveryManualApproved: userDiscoveryManualApproved.present + ? userDiscoveryManualApproved.value + : this.userDiscoveryManualApproved, mediaSendCounter: mediaSendCounter ?? this.mediaSendCounter, mediaReceivedCounter: mediaReceivedCounter ?? this.mediaReceivedCounter, ); @@ -485,6 +547,12 @@ class ContactsData extends DataClass implements Insertable { userDiscoveryVersion: data.userDiscoveryVersion.present ? data.userDiscoveryVersion.value : this.userDiscoveryVersion, + userDiscoveryExcluded: data.userDiscoveryExcluded.present + ? data.userDiscoveryExcluded.value + : this.userDiscoveryExcluded, + userDiscoveryManualApproved: data.userDiscoveryManualApproved.present + ? data.userDiscoveryManualApproved.value + : this.userDiscoveryManualApproved, mediaSendCounter: data.mediaSendCounter.present ? data.mediaSendCounter.value : this.mediaSendCounter, @@ -511,6 +579,8 @@ class ContactsData extends DataClass implements Insertable { ..write('accountDeleted: $accountDeleted, ') ..write('createdAt: $createdAt, ') ..write('userDiscoveryVersion: $userDiscoveryVersion, ') + ..write('userDiscoveryExcluded: $userDiscoveryExcluded, ') + ..write('userDiscoveryManualApproved: $userDiscoveryManualApproved, ') ..write('mediaSendCounter: $mediaSendCounter, ') ..write('mediaReceivedCounter: $mediaReceivedCounter') ..write(')')) @@ -533,6 +603,8 @@ class ContactsData extends DataClass implements Insertable { accountDeleted, createdAt, $driftBlobEquality.hash(userDiscoveryVersion), + userDiscoveryExcluded, + userDiscoveryManualApproved, mediaSendCounter, mediaReceivedCounter, ); @@ -560,6 +632,9 @@ class ContactsData extends DataClass implements Insertable { other.userDiscoveryVersion, this.userDiscoveryVersion, ) && + other.userDiscoveryExcluded == this.userDiscoveryExcluded && + other.userDiscoveryManualApproved == + this.userDiscoveryManualApproved && other.mediaSendCounter == this.mediaSendCounter && other.mediaReceivedCounter == this.mediaReceivedCounter); } @@ -579,6 +654,8 @@ class ContactsCompanion extends UpdateCompanion { final Value accountDeleted; final Value createdAt; final Value userDiscoveryVersion; + final Value userDiscoveryExcluded; + final Value userDiscoveryManualApproved; final Value mediaSendCounter; final Value mediaReceivedCounter; const ContactsCompanion({ @@ -596,6 +673,8 @@ class ContactsCompanion extends UpdateCompanion { this.accountDeleted = const Value.absent(), this.createdAt = const Value.absent(), this.userDiscoveryVersion = const Value.absent(), + this.userDiscoveryExcluded = const Value.absent(), + this.userDiscoveryManualApproved = const Value.absent(), this.mediaSendCounter = const Value.absent(), this.mediaReceivedCounter = const Value.absent(), }); @@ -614,6 +693,8 @@ class ContactsCompanion extends UpdateCompanion { this.accountDeleted = const Value.absent(), this.createdAt = const Value.absent(), this.userDiscoveryVersion = const Value.absent(), + this.userDiscoveryExcluded = const Value.absent(), + this.userDiscoveryManualApproved = const Value.absent(), this.mediaSendCounter = const Value.absent(), this.mediaReceivedCounter = const Value.absent(), }) : username = Value(username); @@ -632,6 +713,8 @@ class ContactsCompanion extends UpdateCompanion { Expression? accountDeleted, Expression? createdAt, Expression? userDiscoveryVersion, + Expression? userDiscoveryExcluded, + Expression? userDiscoveryManualApproved, Expression? mediaSendCounter, Expression? mediaReceivedCounter, }) { @@ -653,6 +736,10 @@ class ContactsCompanion extends UpdateCompanion { if (createdAt != null) 'created_at': createdAt, if (userDiscoveryVersion != null) 'user_discovery_version': userDiscoveryVersion, + if (userDiscoveryExcluded != null) + 'user_discovery_excluded': userDiscoveryExcluded, + if (userDiscoveryManualApproved != null) + 'user_discovery_manual_approved': userDiscoveryManualApproved, if (mediaSendCounter != null) 'media_send_counter': mediaSendCounter, if (mediaReceivedCounter != null) 'media_received_counter': mediaReceivedCounter, @@ -674,6 +761,8 @@ class ContactsCompanion extends UpdateCompanion { Value? accountDeleted, Value? createdAt, Value? userDiscoveryVersion, + Value? userDiscoveryExcluded, + Value? userDiscoveryManualApproved, Value? mediaSendCounter, Value? mediaReceivedCounter, }) { @@ -692,6 +781,10 @@ class ContactsCompanion extends UpdateCompanion { accountDeleted: accountDeleted ?? this.accountDeleted, createdAt: createdAt ?? this.createdAt, userDiscoveryVersion: userDiscoveryVersion ?? this.userDiscoveryVersion, + userDiscoveryExcluded: + userDiscoveryExcluded ?? this.userDiscoveryExcluded, + userDiscoveryManualApproved: + userDiscoveryManualApproved ?? this.userDiscoveryManualApproved, mediaSendCounter: mediaSendCounter ?? this.mediaSendCounter, mediaReceivedCounter: mediaReceivedCounter ?? this.mediaReceivedCounter, ); @@ -746,6 +839,16 @@ class ContactsCompanion extends UpdateCompanion { userDiscoveryVersion.value, ); } + if (userDiscoveryExcluded.present) { + map['user_discovery_excluded'] = Variable( + userDiscoveryExcluded.value, + ); + } + if (userDiscoveryManualApproved.present) { + map['user_discovery_manual_approved'] = Variable( + userDiscoveryManualApproved.value, + ); + } if (mediaSendCounter.present) { map['media_send_counter'] = Variable(mediaSendCounter.value); } @@ -772,6 +875,8 @@ class ContactsCompanion extends UpdateCompanion { ..write('accountDeleted: $accountDeleted, ') ..write('createdAt: $createdAt, ') ..write('userDiscoveryVersion: $userDiscoveryVersion, ') + ..write('userDiscoveryExcluded: $userDiscoveryExcluded, ') + ..write('userDiscoveryManualApproved: $userDiscoveryManualApproved, ') ..write('mediaSendCounter: $mediaSendCounter, ') ..write('mediaReceivedCounter: $mediaReceivedCounter') ..write(')')) @@ -7416,12 +7521,21 @@ class KeyVerifications extends Table final GeneratedDatabase attachedDatabase; final String? _alias; KeyVerifications(this.attachedDatabase, [this._alias]); + late final GeneratedColumn verificationId = GeneratedColumn( + 'verification_id', + aliasedName, + false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + $customConstraints: 'NOT NULL PRIMARY KEY AUTOINCREMENT', + ); late final GeneratedColumn contactId = GeneratedColumn( 'contact_id', aliasedName, false, type: DriftSqlType.int, - requiredDuringInsert: false, + requiredDuringInsert: true, $customConstraints: 'NOT NULL REFERENCES contacts(user_id)ON DELETE CASCADE', ); @@ -7446,18 +7560,27 @@ class KeyVerifications extends Table ), ); @override - List get $columns => [contactId, type, createdAt]; + List get $columns => [ + verificationId, + contactId, + type, + createdAt, + ]; @override String get aliasedName => _alias ?? actualTableName; @override String get actualTableName => $name; static const String $name = 'key_verifications'; @override - Set get $primaryKey => {contactId}; + Set get $primaryKey => {verificationId}; @override KeyVerificationsData map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; return KeyVerificationsData( + verificationId: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}verification_id'], + )!, contactId: attachedDatabase.typeMapping.read( DriftSqlType.int, data['${effectivePrefix}contact_id'], @@ -7478,18 +7601,18 @@ class KeyVerifications extends Table return KeyVerifications(attachedDatabase, alias); } - @override - List get customConstraints => const ['PRIMARY KEY(contact_id)']; @override bool get dontWriteConstraints => true; } class KeyVerificationsData extends DataClass implements Insertable { + final int verificationId; final int contactId; final String type; final int createdAt; const KeyVerificationsData({ + required this.verificationId, required this.contactId, required this.type, required this.createdAt, @@ -7497,6 +7620,7 @@ class KeyVerificationsData extends DataClass @override Map toColumns(bool nullToAbsent) { final map = {}; + map['verification_id'] = Variable(verificationId); map['contact_id'] = Variable(contactId); map['type'] = Variable(type); map['created_at'] = Variable(createdAt); @@ -7505,6 +7629,7 @@ class KeyVerificationsData extends DataClass KeyVerificationsCompanion toCompanion(bool nullToAbsent) { return KeyVerificationsCompanion( + verificationId: Value(verificationId), contactId: Value(contactId), type: Value(type), createdAt: Value(createdAt), @@ -7517,6 +7642,7 @@ class KeyVerificationsData extends DataClass }) { serializer ??= driftRuntimeOptions.defaultSerializer; return KeyVerificationsData( + verificationId: serializer.fromJson(json['verificationId']), contactId: serializer.fromJson(json['contactId']), type: serializer.fromJson(json['type']), createdAt: serializer.fromJson(json['createdAt']), @@ -7526,6 +7652,7 @@ class KeyVerificationsData extends DataClass Map toJson({ValueSerializer? serializer}) { serializer ??= driftRuntimeOptions.defaultSerializer; return { + 'verificationId': serializer.toJson(verificationId), 'contactId': serializer.toJson(contactId), 'type': serializer.toJson(type), 'createdAt': serializer.toJson(createdAt), @@ -7533,16 +7660,21 @@ class KeyVerificationsData extends DataClass } KeyVerificationsData copyWith({ + int? verificationId, int? contactId, String? type, int? createdAt, }) => KeyVerificationsData( + verificationId: verificationId ?? this.verificationId, contactId: contactId ?? this.contactId, type: type ?? this.type, createdAt: createdAt ?? this.createdAt, ); KeyVerificationsData copyWithCompanion(KeyVerificationsCompanion data) { return KeyVerificationsData( + verificationId: data.verificationId.present + ? data.verificationId.value + : this.verificationId, contactId: data.contactId.present ? data.contactId.value : this.contactId, type: data.type.present ? data.type.value : this.type, createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, @@ -7552,6 +7684,7 @@ class KeyVerificationsData extends DataClass @override String toString() { return (StringBuffer('KeyVerificationsData(') + ..write('verificationId: $verificationId, ') ..write('contactId: $contactId, ') ..write('type: $type, ') ..write('createdAt: $createdAt') @@ -7560,36 +7693,43 @@ class KeyVerificationsData extends DataClass } @override - int get hashCode => Object.hash(contactId, type, createdAt); + int get hashCode => Object.hash(verificationId, contactId, type, createdAt); @override bool operator ==(Object other) => identical(this, other) || (other is KeyVerificationsData && + other.verificationId == this.verificationId && other.contactId == this.contactId && other.type == this.type && other.createdAt == this.createdAt); } class KeyVerificationsCompanion extends UpdateCompanion { + final Value verificationId; final Value contactId; final Value type; final Value createdAt; const KeyVerificationsCompanion({ + this.verificationId = const Value.absent(), this.contactId = const Value.absent(), this.type = const Value.absent(), this.createdAt = const Value.absent(), }); KeyVerificationsCompanion.insert({ - this.contactId = const Value.absent(), + this.verificationId = const Value.absent(), + required int contactId, required String type, this.createdAt = const Value.absent(), - }) : type = Value(type); + }) : contactId = Value(contactId), + type = Value(type); static Insertable custom({ + Expression? verificationId, Expression? contactId, Expression? type, Expression? createdAt, }) { return RawValuesInsertable({ + if (verificationId != null) 'verification_id': verificationId, if (contactId != null) 'contact_id': contactId, if (type != null) 'type': type, if (createdAt != null) 'created_at': createdAt, @@ -7597,11 +7737,13 @@ class KeyVerificationsCompanion extends UpdateCompanion { } KeyVerificationsCompanion copyWith({ + Value? verificationId, Value? contactId, Value? type, Value? createdAt, }) { return KeyVerificationsCompanion( + verificationId: verificationId ?? this.verificationId, contactId: contactId ?? this.contactId, type: type ?? this.type, createdAt: createdAt ?? this.createdAt, @@ -7611,6 +7753,9 @@ class KeyVerificationsCompanion extends UpdateCompanion { @override Map toColumns(bool nullToAbsent) { final map = {}; + if (verificationId.present) { + map['verification_id'] = Variable(verificationId.value); + } if (contactId.present) { map['contact_id'] = Variable(contactId.value); } @@ -7626,6 +7771,7 @@ class KeyVerificationsCompanion extends UpdateCompanion { @override String toString() { return (StringBuffer('KeyVerificationsCompanion(') + ..write('verificationId: $verificationId, ') ..write('contactId: $contactId, ') ..write('type: $type, ') ..write('createdAt: $createdAt') @@ -7894,11 +8040,41 @@ class UserDiscoveryAnnouncedUsers extends Table requiredDuringInsert: true, $customConstraints: 'NOT NULL UNIQUE', ); + late final GeneratedColumn username = GeneratedColumn( + 'username', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: 'NULL', + ); + late final GeneratedColumn wasShownToTheUser = GeneratedColumn( + 'was_shown_to_the_user', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + $customConstraints: + 'NOT NULL DEFAULT 0 CHECK (was_shown_to_the_user IN (0, 1))', + defaultValue: const CustomExpression('0'), + ); + late final GeneratedColumn isHidden = GeneratedColumn( + 'is_hidden', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + $customConstraints: 'NOT NULL DEFAULT 0 CHECK (is_hidden IN (0, 1))', + defaultValue: const CustomExpression('0'), + ); @override List get $columns => [ announcedUserId, announcedPublicKey, publicId, + username, + wasShownToTheUser, + isHidden, ]; @override String get aliasedName => _alias ?? actualTableName; @@ -7926,6 +8102,18 @@ class UserDiscoveryAnnouncedUsers extends Table DriftSqlType.int, data['${effectivePrefix}public_id'], )!, + username: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}username'], + ), + wasShownToTheUser: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}was_shown_to_the_user'], + )!, + isHidden: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}is_hidden'], + )!, ); } @@ -7947,10 +8135,16 @@ class UserDiscoveryAnnouncedUsersData extends DataClass final int announcedUserId; final i2.Uint8List announcedPublicKey; final int publicId; + final String? username; + final int wasShownToTheUser; + final int isHidden; const UserDiscoveryAnnouncedUsersData({ required this.announcedUserId, required this.announcedPublicKey, required this.publicId, + this.username, + required this.wasShownToTheUser, + required this.isHidden, }); @override Map toColumns(bool nullToAbsent) { @@ -7958,6 +8152,11 @@ class UserDiscoveryAnnouncedUsersData extends DataClass map['announced_user_id'] = Variable(announcedUserId); map['announced_public_key'] = Variable(announcedPublicKey); map['public_id'] = Variable(publicId); + if (!nullToAbsent || username != null) { + map['username'] = Variable(username); + } + map['was_shown_to_the_user'] = Variable(wasShownToTheUser); + map['is_hidden'] = Variable(isHidden); return map; } @@ -7966,6 +8165,11 @@ class UserDiscoveryAnnouncedUsersData extends DataClass announcedUserId: Value(announcedUserId), announcedPublicKey: Value(announcedPublicKey), publicId: Value(publicId), + username: username == null && nullToAbsent + ? const Value.absent() + : Value(username), + wasShownToTheUser: Value(wasShownToTheUser), + isHidden: Value(isHidden), ); } @@ -7980,6 +8184,9 @@ class UserDiscoveryAnnouncedUsersData extends DataClass json['announcedPublicKey'], ), publicId: serializer.fromJson(json['publicId']), + username: serializer.fromJson(json['username']), + wasShownToTheUser: serializer.fromJson(json['wasShownToTheUser']), + isHidden: serializer.fromJson(json['isHidden']), ); } @override @@ -7989,6 +8196,9 @@ class UserDiscoveryAnnouncedUsersData extends DataClass 'announcedUserId': serializer.toJson(announcedUserId), 'announcedPublicKey': serializer.toJson(announcedPublicKey), 'publicId': serializer.toJson(publicId), + 'username': serializer.toJson(username), + 'wasShownToTheUser': serializer.toJson(wasShownToTheUser), + 'isHidden': serializer.toJson(isHidden), }; } @@ -7996,10 +8206,16 @@ class UserDiscoveryAnnouncedUsersData extends DataClass int? announcedUserId, i2.Uint8List? announcedPublicKey, int? publicId, + Value username = const Value.absent(), + int? wasShownToTheUser, + int? isHidden, }) => UserDiscoveryAnnouncedUsersData( announcedUserId: announcedUserId ?? this.announcedUserId, announcedPublicKey: announcedPublicKey ?? this.announcedPublicKey, publicId: publicId ?? this.publicId, + username: username.present ? username.value : this.username, + wasShownToTheUser: wasShownToTheUser ?? this.wasShownToTheUser, + isHidden: isHidden ?? this.isHidden, ); UserDiscoveryAnnouncedUsersData copyWithCompanion( UserDiscoveryAnnouncedUsersCompanion data, @@ -8012,6 +8228,11 @@ class UserDiscoveryAnnouncedUsersData extends DataClass ? data.announcedPublicKey.value : this.announcedPublicKey, publicId: data.publicId.present ? data.publicId.value : this.publicId, + username: data.username.present ? data.username.value : this.username, + wasShownToTheUser: data.wasShownToTheUser.present + ? data.wasShownToTheUser.value + : this.wasShownToTheUser, + isHidden: data.isHidden.present ? data.isHidden.value : this.isHidden, ); } @@ -8020,7 +8241,10 @@ class UserDiscoveryAnnouncedUsersData extends DataClass return (StringBuffer('UserDiscoveryAnnouncedUsersData(') ..write('announcedUserId: $announcedUserId, ') ..write('announcedPublicKey: $announcedPublicKey, ') - ..write('publicId: $publicId') + ..write('publicId: $publicId, ') + ..write('username: $username, ') + ..write('wasShownToTheUser: $wasShownToTheUser, ') + ..write('isHidden: $isHidden') ..write(')')) .toString(); } @@ -8030,6 +8254,9 @@ class UserDiscoveryAnnouncedUsersData extends DataClass announcedUserId, $driftBlobEquality.hash(announcedPublicKey), publicId, + username, + wasShownToTheUser, + isHidden, ); @override bool operator ==(Object other) => @@ -8040,7 +8267,10 @@ class UserDiscoveryAnnouncedUsersData extends DataClass other.announcedPublicKey, this.announcedPublicKey, ) && - other.publicId == this.publicId); + other.publicId == this.publicId && + other.username == this.username && + other.wasShownToTheUser == this.wasShownToTheUser && + other.isHidden == this.isHidden); } class UserDiscoveryAnnouncedUsersCompanion @@ -8048,27 +8278,42 @@ class UserDiscoveryAnnouncedUsersCompanion final Value announcedUserId; final Value announcedPublicKey; final Value publicId; + final Value username; + final Value wasShownToTheUser; + final Value isHidden; const UserDiscoveryAnnouncedUsersCompanion({ this.announcedUserId = const Value.absent(), this.announcedPublicKey = const Value.absent(), this.publicId = const Value.absent(), + this.username = const Value.absent(), + this.wasShownToTheUser = const Value.absent(), + this.isHidden = const Value.absent(), }); UserDiscoveryAnnouncedUsersCompanion.insert({ this.announcedUserId = const Value.absent(), required i2.Uint8List announcedPublicKey, required int publicId, + this.username = const Value.absent(), + this.wasShownToTheUser = const Value.absent(), + this.isHidden = const Value.absent(), }) : announcedPublicKey = Value(announcedPublicKey), publicId = Value(publicId); static Insertable custom({ Expression? announcedUserId, Expression? announcedPublicKey, Expression? publicId, + Expression? username, + Expression? wasShownToTheUser, + Expression? isHidden, }) { return RawValuesInsertable({ if (announcedUserId != null) 'announced_user_id': announcedUserId, if (announcedPublicKey != null) 'announced_public_key': announcedPublicKey, if (publicId != null) 'public_id': publicId, + if (username != null) 'username': username, + if (wasShownToTheUser != null) 'was_shown_to_the_user': wasShownToTheUser, + if (isHidden != null) 'is_hidden': isHidden, }); } @@ -8076,11 +8321,17 @@ class UserDiscoveryAnnouncedUsersCompanion Value? announcedUserId, Value? announcedPublicKey, Value? publicId, + Value? username, + Value? wasShownToTheUser, + Value? isHidden, }) { return UserDiscoveryAnnouncedUsersCompanion( announcedUserId: announcedUserId ?? this.announcedUserId, announcedPublicKey: announcedPublicKey ?? this.announcedPublicKey, publicId: publicId ?? this.publicId, + username: username ?? this.username, + wasShownToTheUser: wasShownToTheUser ?? this.wasShownToTheUser, + isHidden: isHidden ?? this.isHidden, ); } @@ -8098,6 +8349,15 @@ class UserDiscoveryAnnouncedUsersCompanion if (publicId.present) { map['public_id'] = Variable(publicId.value); } + if (username.present) { + map['username'] = Variable(username.value); + } + if (wasShownToTheUser.present) { + map['was_shown_to_the_user'] = Variable(wasShownToTheUser.value); + } + if (isHidden.present) { + map['is_hidden'] = Variable(isHidden.value); + } return map; } @@ -8106,7 +8366,10 @@ class UserDiscoveryAnnouncedUsersCompanion return (StringBuffer('UserDiscoveryAnnouncedUsersCompanion(') ..write('announcedUserId: $announcedUserId, ') ..write('announcedPublicKey: $announcedPublicKey, ') - ..write('publicId: $publicId') + ..write('publicId: $publicId, ') + ..write('username: $username, ') + ..write('wasShownToTheUser: $wasShownToTheUser, ') + ..write('isHidden: $isHidden') ..write(')')) .toString(); } @@ -8458,7 +8721,7 @@ class UserDiscoveryOtherPromotions extends Table String get actualTableName => $name; static const String $name = 'user_discovery_other_promotions'; @override - Set get $primaryKey => {fromContactId, promotionId}; + Set get $primaryKey => {fromContactId, publicId}; @override UserDiscoveryOtherPromotionsData map( Map data, { @@ -8500,7 +8763,7 @@ class UserDiscoveryOtherPromotions extends Table @override List get customConstraints => const [ - 'PRIMARY KEY(from_contact_id, promotion_id)', + 'PRIMARY KEY(from_contact_id, public_id)', ]; @override bool get dontWriteConstraints => true; @@ -9235,6 +9498,419 @@ class UserDiscoverySharesCompanion } } +class Shortcuts extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Shortcuts(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + $customConstraints: 'NOT NULL PRIMARY KEY AUTOINCREMENT', + ); + late final GeneratedColumn emoji = GeneratedColumn( + 'emoji', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL UNIQUE', + ); + late final GeneratedColumn usageCounter = GeneratedColumn( + 'usage_counter', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + $customConstraints: 'NOT NULL DEFAULT 0', + defaultValue: const CustomExpression('0'), + ); + @override + List get $columns => [id, emoji, usageCounter]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'shortcuts'; + @override + Set get $primaryKey => {id}; + @override + ShortcutsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ShortcutsData( + id: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}id'], + )!, + emoji: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}emoji'], + )!, + usageCounter: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}usage_counter'], + )!, + ); + } + + @override + Shortcuts createAlias(String alias) { + return Shortcuts(attachedDatabase, alias); + } + + @override + bool get dontWriteConstraints => true; +} + +class ShortcutsData extends DataClass implements Insertable { + final int id; + final String emoji; + final int usageCounter; + const ShortcutsData({ + required this.id, + required this.emoji, + required this.usageCounter, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['emoji'] = Variable(emoji); + map['usage_counter'] = Variable(usageCounter); + return map; + } + + ShortcutsCompanion toCompanion(bool nullToAbsent) { + return ShortcutsCompanion( + id: Value(id), + emoji: Value(emoji), + usageCounter: Value(usageCounter), + ); + } + + factory ShortcutsData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ShortcutsData( + id: serializer.fromJson(json['id']), + emoji: serializer.fromJson(json['emoji']), + usageCounter: serializer.fromJson(json['usageCounter']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'emoji': serializer.toJson(emoji), + 'usageCounter': serializer.toJson(usageCounter), + }; + } + + ShortcutsData copyWith({int? id, String? emoji, int? usageCounter}) => + ShortcutsData( + id: id ?? this.id, + emoji: emoji ?? this.emoji, + usageCounter: usageCounter ?? this.usageCounter, + ); + ShortcutsData copyWithCompanion(ShortcutsCompanion data) { + return ShortcutsData( + id: data.id.present ? data.id.value : this.id, + emoji: data.emoji.present ? data.emoji.value : this.emoji, + usageCounter: data.usageCounter.present + ? data.usageCounter.value + : this.usageCounter, + ); + } + + @override + String toString() { + return (StringBuffer('ShortcutsData(') + ..write('id: $id, ') + ..write('emoji: $emoji, ') + ..write('usageCounter: $usageCounter') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, emoji, usageCounter); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ShortcutsData && + other.id == this.id && + other.emoji == this.emoji && + other.usageCounter == this.usageCounter); +} + +class ShortcutsCompanion extends UpdateCompanion { + final Value id; + final Value emoji; + final Value usageCounter; + const ShortcutsCompanion({ + this.id = const Value.absent(), + this.emoji = const Value.absent(), + this.usageCounter = const Value.absent(), + }); + ShortcutsCompanion.insert({ + this.id = const Value.absent(), + required String emoji, + this.usageCounter = const Value.absent(), + }) : emoji = Value(emoji); + static Insertable custom({ + Expression? id, + Expression? emoji, + Expression? usageCounter, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (emoji != null) 'emoji': emoji, + if (usageCounter != null) 'usage_counter': usageCounter, + }); + } + + ShortcutsCompanion copyWith({ + Value? id, + Value? emoji, + Value? usageCounter, + }) { + return ShortcutsCompanion( + id: id ?? this.id, + emoji: emoji ?? this.emoji, + usageCounter: usageCounter ?? this.usageCounter, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (emoji.present) { + map['emoji'] = Variable(emoji.value); + } + if (usageCounter.present) { + map['usage_counter'] = Variable(usageCounter.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ShortcutsCompanion(') + ..write('id: $id, ') + ..write('emoji: $emoji, ') + ..write('usageCounter: $usageCounter') + ..write(')')) + .toString(); + } +} + +class ShortcutMembers extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + ShortcutMembers(this.attachedDatabase, [this._alias]); + late final GeneratedColumn shortcutId = GeneratedColumn( + 'shortcut_id', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL REFERENCES shortcuts(id)ON DELETE CASCADE', + ); + late final GeneratedColumn groupId = GeneratedColumn( + 'group_id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'NOT NULL REFERENCES "groups"(group_id)ON DELETE CASCADE', + ); + @override + List get $columns => [shortcutId, groupId]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'shortcut_members'; + @override + Set get $primaryKey => {shortcutId, groupId}; + @override + ShortcutMembersData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ShortcutMembersData( + shortcutId: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}shortcut_id'], + )!, + groupId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}group_id'], + )!, + ); + } + + @override + ShortcutMembers createAlias(String alias) { + return ShortcutMembers(attachedDatabase, alias); + } + + @override + List get customConstraints => const [ + 'PRIMARY KEY(shortcut_id, group_id)', + ]; + @override + bool get dontWriteConstraints => true; +} + +class ShortcutMembersData extends DataClass + implements Insertable { + final int shortcutId; + final String groupId; + const ShortcutMembersData({required this.shortcutId, required this.groupId}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['shortcut_id'] = Variable(shortcutId); + map['group_id'] = Variable(groupId); + return map; + } + + ShortcutMembersCompanion toCompanion(bool nullToAbsent) { + return ShortcutMembersCompanion( + shortcutId: Value(shortcutId), + groupId: Value(groupId), + ); + } + + factory ShortcutMembersData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ShortcutMembersData( + shortcutId: serializer.fromJson(json['shortcutId']), + groupId: serializer.fromJson(json['groupId']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'shortcutId': serializer.toJson(shortcutId), + 'groupId': serializer.toJson(groupId), + }; + } + + ShortcutMembersData copyWith({int? shortcutId, String? groupId}) => + ShortcutMembersData( + shortcutId: shortcutId ?? this.shortcutId, + groupId: groupId ?? this.groupId, + ); + ShortcutMembersData copyWithCompanion(ShortcutMembersCompanion data) { + return ShortcutMembersData( + shortcutId: data.shortcutId.present + ? data.shortcutId.value + : this.shortcutId, + groupId: data.groupId.present ? data.groupId.value : this.groupId, + ); + } + + @override + String toString() { + return (StringBuffer('ShortcutMembersData(') + ..write('shortcutId: $shortcutId, ') + ..write('groupId: $groupId') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(shortcutId, groupId); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ShortcutMembersData && + other.shortcutId == this.shortcutId && + other.groupId == this.groupId); +} + +class ShortcutMembersCompanion extends UpdateCompanion { + final Value shortcutId; + final Value groupId; + final Value rowid; + const ShortcutMembersCompanion({ + this.shortcutId = const Value.absent(), + this.groupId = const Value.absent(), + this.rowid = const Value.absent(), + }); + ShortcutMembersCompanion.insert({ + required int shortcutId, + required String groupId, + this.rowid = const Value.absent(), + }) : shortcutId = Value(shortcutId), + groupId = Value(groupId); + static Insertable custom({ + Expression? shortcutId, + Expression? groupId, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (shortcutId != null) 'shortcut_id': shortcutId, + if (groupId != null) 'group_id': groupId, + if (rowid != null) 'rowid': rowid, + }); + } + + ShortcutMembersCompanion copyWith({ + Value? shortcutId, + Value? groupId, + Value? rowid, + }) { + return ShortcutMembersCompanion( + shortcutId: shortcutId ?? this.shortcutId, + groupId: groupId ?? this.groupId, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (shortcutId.present) { + map['shortcut_id'] = Variable(shortcutId.value); + } + if (groupId.present) { + map['group_id'] = Variable(groupId.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ShortcutMembersCompanion(') + ..write('shortcutId: $shortcutId, ') + ..write('groupId: $groupId, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + class DatabaseAtV13 extends GeneratedDatabase { DatabaseAtV13(QueryExecutor e) : super(e); late final Contacts contacts = Contacts(this); @@ -9269,6 +9945,8 @@ class DatabaseAtV13 extends GeneratedDatabase { late final UserDiscoveryShares userDiscoveryShares = UserDiscoveryShares( this, ); + late final Shortcuts shortcuts = Shortcuts(this); + late final ShortcutMembers shortcutMembers = ShortcutMembers(this); @override Iterable> get allTables => allSchemaEntities.whereType>(); @@ -9296,6 +9974,8 @@ class DatabaseAtV13 extends GeneratedDatabase { userDiscoveryOtherPromotions, userDiscoveryOwnPromotions, userDiscoveryShares, + shortcuts, + shortcutMembers, ]; @override StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules([ @@ -9433,6 +10113,20 @@ class DatabaseAtV13 extends GeneratedDatabase { ), result: [TableUpdate('user_discovery_shares', kind: UpdateKind.delete)], ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'shortcuts', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('shortcut_members', kind: UpdateKind.delete)], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'groups', + limitUpdateKind: UpdateKind.delete, + ), + result: [TableUpdate('shortcut_members', kind: UpdateKind.delete)], + ), ]); @override int get schemaVersion => 13;