diff --git a/asset/lang/en-US.json b/asset/lang/en-US.json index 1933138..bf642bf 100644 --- a/asset/lang/en-US.json +++ b/asset/lang/en-US.json @@ -48,6 +48,27 @@ "tab4":"CARTOONY", "tab5":"TOYS" } + }, + "burgers":{ + "favoriteProducts":"Best \nSelling", + "normalProducts":"Burgers" + }, + "setting":{ + "title":"Settings", + "about":{ + "title":"About Project", + "contribitions":"Project Contributors" + }, + "core":{ + "title":"Project Core", + "themeTitle":"Theme Change", + "themeDesc":"You can change applicaton theme.", + "langTitle":"Language Change", + "langDesc":"You can change applicaton language." + }, + "exit":"Exit", + "applicationTour":"Application Tuor" + } } } \ No newline at end of file diff --git a/asset/lang/tr-TR.json b/asset/lang/tr-TR.json new file mode 100644 index 0000000..054121c --- /dev/null +++ b/asset/lang/tr-TR.json @@ -0,0 +1,75 @@ +{ + "welcome": "Welcome to My App", + "onBoard":{ + "page1": + {"title":"Make It Good","desc":"You are not alone. You have unique abiltiyto go to anther world"}, + "page2": + {"title":"Make It Good","desc":"You are not alone. You have unique abiltiyto go to anther world"}, + "page3": + {"title":"Make It Good","desc":"You are not alone. You have unique abiltiyto go to anther world"} + }, + + "login":{ + "tab1":"Login", + "tab2":"SignUp", + "email":"Email", + "password":"Password", + "forgotText":"Forgot Password", + "login":"Login", + "dontAccount":"Dont have account" + }, + "home":{ + "build":{ + "tabbar":{ + "tab1":"Latest", + "tab2":"Decorative", + "tab3":"Music", + "tab4":"Style" + }, + "subTitle":"Recommended" + }, + "social":{ + "cancel":"Cancel", + "next":"Next", + "search":"Search", + "findFriends":"Find Friends", + "follow":"Follow", + "following":"Following" + }, + "game":{ + "title":"Birlik Oyun", + "newUpdate":"Yeni Güncellenmiş Oyunlar", + "viewAll":"Görünüm Herşey", + "topDownload":"Üst İndirilenler", + "tabbar":{ + "tab1":"YARIŞ", + "tab2":"Simülasyon", + "tab3":"Gündelik", + "tab4":"Karikatüry", + "tab5":"Oyuncaklar" + } + }, + "burgers":{ + "favoriteProducts":"En Çok Satılanlar", + "normalProducts":"Burgerler" + }, + "setting":{ + "title":"Ayarlar", + "about":{ + "title":"Proje Hakkında", + "contribitions":"Proje Katkıda Bulunanlar" + }, + "core":{ + "title":"Project Core", + + "themeTitle":"Tema değişikliği", + "themeDesc":"Uygulama temasını değiştirebilirsiniz.", + "langTitle":"Dil değişimi", + "langDesc":"Uygulama dilini değiştirebilirsiniz." + }, + "exit":"Exit", + "applicationTour":"Uygulama Turu" + + } + } +} \ No newline at end of file diff --git a/asset/lottie/moon.json b/asset/lottie/moon.json new file mode 100644 index 0000000..54c9c4b --- /dev/null +++ b/asset/lottie/moon.json @@ -0,0 +1 @@ +{"v":"5.1.1","fr":60,"ip":0,"op":180,"w":256,"h":256,"nm":"Moon","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":135,"s":[0],"e":[100]},{"t":179}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[202,219,0],"ix":2},"a":{"a":0,"k":[11,11,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.27,-1.61],[-1.61,-5.27],[-5.26,1.61],[1.61,5.27]],"o":[[5.27,1.61],[1.61,-5.27],[-5.26,-1.61],[-1.61,5.27]],"v":[[0,11],[11,22],[22,11],[11,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.12941176470588237,0.29411764705882354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":100,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":140,"s":[100],"e":[0]},{"t":175}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[184.5,63.5,0],"ix":2},"a":{"a":0,"k":[6.5,6.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.11,-0.95],[-0.95,-3.11],[-3.11,0.95],[0.95,3.11]],"o":[[3.11,0.95],[0.95,-3.11],[-3.11,-0.95],[-0.95,3.11]],"v":[[0,6.5],[6.5,13],[13,6.5],[6.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.12941176470588237,0.29411764705882354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":5,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":80,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":160,"s":[100],"e":[0]},{"t":179}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[23.5,170.5,0],"ix":2},"a":{"a":0,"k":[8.5,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.07,-1.24],[-1.24,-4.07],[-4.07,1.24],[1.24,4.07]],"o":[[4.07,1.24],[1.24,-4.07],[-4.07,-1.24],[-1.24,4.07]],"v":[[0,8.5],[8.5,17],[17,8.5],[8.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.12941176470588237,0.29411764705882354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":55,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":95,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":135,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":169,"s":[100],"e":[0]},{"t":179}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[148,107,0],"ix":2},"a":{"a":0,"k":[9,9,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.31,-1.32],[-1.31,-4.31],[-4.31,1.32],[1.32,4.31]],"o":[[4.31,1.31],[1.32,-4.31],[-4.31,-1.32],[-1.31,4.31]],"v":[[0,9],[9,18],[18,9],[9,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.12941176470588237,0.29411764705882354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"moon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.4,128.2,0],"ix":2},"a":{"a":0,"k":[90.4,89.2,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-40.4,9.1],[0,-11.8],[-42.4,0],[-11.9,7.5],[46.8,0],[0,49.9]],"o":[[-4.8,10],[0,42.3],[15.1,0],[-4.8,45.3],[-50,0],[0,-43]],"v":[[70.5,0],[62.9,33.1],[139.7,109.6],[180.8,97.7],[90.6,178.4],[0,88.1]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.12941176470588237,0.29411764705882354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"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,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"bond","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","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":"bond","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/asset/lottie/sunny.json b/asset/lottie/sunny.json new file mode 100644 index 0000000..25db6b1 --- /dev/null +++ b/asset/lottie/sunny.json @@ -0,0 +1 @@ +{"v":"5.5.2","fr":60,"ip":0,"op":481,"w":600,"h":600,"nm":"sun","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"sun","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299.552,299.897,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[358.951,358.95],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Group 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0.001,0.544,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[147.987,73.76],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path 6","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,25.901,0],"ix":2},"a":{"a":0,"k":[32.446,10.979,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[11.662,0],[8.246,8.246],[-2.096,2.096],[-2.096,-2.099],[-8.795,0],[-6.219,6.216],[-2.096,-2.099],[2.096,-2.099],[11.662,0]],"o":[[-11.662,0],[-2.096,-2.099],[2.099,-2.099],[6.219,6.216],[8.795,0],[2.096,-2.099],[2.096,2.096],[-8.246,8.246],[0,0]],"v":[[32.446,21.959],[1.572,9.17],[1.572,1.574],[9.167,1.574],[32.446,11.215],[55.724,1.574],[63.32,1.574],[63.32,9.17],[32.446,21.959]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[32.446,21.959]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.572549019608,0.211764705882,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":"Path 6","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path 5","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50.63,-27.79,0],"ix":2},"a":{"a":0,"k":[23.363,9.091,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.373,0],[1.049,1.049],[7.826,-7.826],[2.096,2.096],[-2.099,2.096],[-12.015,-12.015],[2.096,-2.096]],"o":[[-1.376,0],[-7.826,-7.828],[-2.099,2.096],[-2.099,-2.099],[12.013,-12.015],[2.096,2.096],[-1.049,1.049]],"v":[[41.355,18.181],[37.556,16.607],[9.169,16.607],[1.574,16.607],[1.574,9.012],[45.154,9.012],[45.154,16.607]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[41.355,18.181]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.572549019608,0.211764705882,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":"Path 5","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path 4","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-50.631,-27.79,0],"ix":2},"a":{"a":0,"k":[23.363,9.091,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.376,0],[1.047,1.049],[-2.099,2.096],[-12.013,-12.015],[2.099,-2.099],[2.099,2.096],[7.828,-7.828]],"o":[[-1.373,0],[-2.099,-2.099],[12.016,-12.015],[2.099,2.096],[-2.096,2.096],[-7.826,-7.828],[-1.049,1.049]],"v":[[5.371,18.181],[1.574,16.607],[1.574,9.012],[45.152,9.012],[45.152,16.607],[37.556,16.607],[9.17,16.607]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[5.371,18.181]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.572549019608,0.211764705882,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":"Path 4","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path 3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[17.165,-0.001,0],"ix":2},"a":{"a":0,"k":[100.882,120.063,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-61.233],[57.003,-8.202],[0,61.231],[-57.006,8.202]],"o":[[0,61.23],[-57.006,-8.202],[0,-61.233],[57.004,8.202]],"v":[[201.764,120.064],[100.883,240.126],[0,120.064],[100.883,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[201.764,120.064]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.81568627451,0.450980392157,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":"Path 3","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.002,-0.001,0],"ix":2},"a":{"a":0,"k":[121.192,121.187,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-61.213],[58.959,-8.2],[5.718,0],[0,66.928],[-66.932,0],[-5.505,-0.77],[0,-61.213]],"o":[[0,61.21],[-5.505,0.773],[-66.932,0],[0,-66.931],[5.718,0],[58.959,8.199],[0,0]],"v":[[242.383,121.188],[138.042,241.212],[121.197,242.375],[0,121.189],[121.197,0],[138.042,1.163],[242.383,121.188]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[242.383,121.188]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019607843,0.560784313725,0.266666666667,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":"Path 2","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Path 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[23]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":180,"s":[23]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":240,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[23]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":360,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":420,"s":[23]},{"t":480,"s":[0]}],"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[179.476,179.475,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,15.248],[3.757,14.065],[7.372,12.743],[10.489,10.489],[12.926,7.476],[14.553,3.892],[15.248,0],[14.065,-3.757],[12.743,-7.372],[10.489,-10.489],[7.476,-12.926],[3.892,-14.553],[0,-15.248],[-3.757,-14.065],[-7.372,-12.743],[-10.489,-10.489],[-12.926,-7.476],[-14.553,-3.892],[-15.248,0],[-14.065,3.757],[-12.743,7.372],[-10.489,10.489],[-7.476,12.926],[-3.892,14.553]],"o":[[0,-15.248],[-3.892,-14.553],[-7.479,-12.923],[-10.489,-10.489],[-12.74,-7.372],[-14.065,-3.757],[-15.248,0],[-14.553,3.891],[-12.923,7.479],[-10.489,10.489],[-7.372,12.74],[-3.757,14.065],[0,15.248],[3.892,14.553],[7.479,12.923],[10.489,10.489],[12.74,7.372],[14.065,3.757],[15.248,0],[14.553,-3.892],[12.923,-7.479],[10.489,-10.489],[7.372,-12.74],[3.757,-14.065]],"v":[[334.728,179.475],[358.6,131.487],[313.961,101.848],[310.571,48.38],[257.1,44.99],[227.464,0.351],[179.476,24.223],[131.488,0.351],[101.848,44.99],[48.38,48.38],[44.99,101.851],[0.351,131.487],[24.223,179.475],[0.351,227.463],[44.99,257.102],[48.38,310.57],[101.851,313.961],[131.488,358.599],[179.476,334.727],[227.464,358.599],[257.103,313.961],[310.571,310.57],[313.961,257.1],[358.6,227.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[334.728,179.475]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.933333333333,0.549019607843,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":"Path 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 69bf618..bf6d36c 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -18,6 +18,8 @@ PODS: - FMDB (>= 2.7.5) - url_launcher (0.0.1): - Flutter + - webview_flutter (0.0.1): + - Flutter DEPENDENCIES: - device_info (from `.symlinks/plugins/device_info/ios`) @@ -28,6 +30,7 @@ DEPENDENCIES: - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) + - webview_flutter (from `.symlinks/plugins/webview_flutter/ios`) SPEC REPOS: trunk: @@ -50,6 +53,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/sqflite/ios" url_launcher: :path: ".symlinks/plugins/url_launcher/ios" + webview_flutter: + :path: ".symlinks/plugins/webview_flutter/ios" SPEC CHECKSUMS: device_info: d7d233b645a32c40dfdc212de5cf646ca482f175 @@ -61,6 +66,7 @@ SPEC CHECKSUMS: shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef + webview_flutter: 9f491a9b5a66f2573946a389b2677987b0ff8c0b PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c diff --git a/lib/core/components/slider/range_price_slider.dart b/lib/core/components/slider/range_price_slider.dart new file mode 100644 index 0000000..b16198c --- /dev/null +++ b/lib/core/components/slider/range_price_slider.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +class RangePriceSLider extends StatefulWidget { + final double min; + final double max; + + final void Function(RangeValues values) onCompleted; + + const RangePriceSLider({Key? key, required this.min, required this.max, required this.onCompleted}) : super(key: key); + @override + _RangePriceSLiderState createState() => _RangePriceSLiderState(); +} + +class _RangePriceSLiderState extends State { + late RangeValues _values; + + @override + void initState() { + super.initState(); + _values = RangeValues(widget.min, widget.max); + } + + @override + Widget build(BuildContext context) { + return RangeSlider( + values: _values, + max: widget.max, + min: widget.min, + labels: RangeLabels('${_values.start}', '${_values.end}'), + activeColor: Colors.red, + divisions: 10, + onChanged: (value) { + setState(() { + _values = value; + }); + widget.onCompleted(_values); + }, + ); + } +} diff --git a/lib/core/constants/app/app_constants.dart b/lib/core/constants/app/app_constants.dart index cb062d6..935bcbb 100644 --- a/lib/core/constants/app/app_constants.dart +++ b/lib/core/constants/app/app_constants.dart @@ -5,4 +5,6 @@ class ApplicationConstants { static const COMPANY_NAME = 'HWA'; static const EMAIL_REGIEX = r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}\$'; + + static const APP_WEB_SITE = 'https://github.com/VB10/flutter-architecture-template'; } diff --git a/lib/core/constants/navigation/navigation_constants.dart b/lib/core/constants/navigation/navigation_constants.dart index a38d80b..bb1b845 100644 --- a/lib/core/constants/navigation/navigation_constants.dart +++ b/lib/core/constants/navigation/navigation_constants.dart @@ -1,3 +1,6 @@ class NavigationConstants { static const TEST_VIEW = '/test'; + + static const SETTINGS_WEB_VIEW = '/settingsWebView'; + static const ON_BOARD = '/onBoard'; } diff --git a/lib/core/extension/widget_extension.dart b/lib/core/extension/widget_extension.dart new file mode 100644 index 0000000..3841427 --- /dev/null +++ b/lib/core/extension/widget_extension.dart @@ -0,0 +1,7 @@ +import 'package:flutter/material.dart'; + +extension WidgetExtension on Widget { + Widget get toSliver { + return SliverToBoxAdapter(child: this); + } +} diff --git a/lib/core/init/cache/locale_manager.dart b/lib/core/init/cache/locale_manager.dart index 84e2d3b..c41409c 100644 --- a/lib/core/init/cache/locale_manager.dart +++ b/lib/core/init/cache/locale_manager.dart @@ -21,6 +21,13 @@ class LocaleManager { await _preferences!.clear(); } + Future clearAllSaveFirst() async { + if (_preferences != null) { + await _preferences!.clear(); + await setBoolValue(PreferencesKeys.IS_FIRST_APP, true); + } + } + Future setStringValue(PreferencesKeys key, String value) async { await _preferences!.setString(key.toString(), value); } diff --git a/lib/core/init/lang/language_manager.dart b/lib/core/init/lang/language_manager.dart index ca6b4f8..a946053 100644 --- a/lib/core/init/lang/language_manager.dart +++ b/lib/core/init/lang/language_manager.dart @@ -10,6 +10,7 @@ class LanguageManager { LanguageManager._init(); final enLocale = Locale('en', 'US'); + final trLocale = Locale('tr', 'TR'); - List get supportedLocales => [enLocale]; + List get supportedLocales => [enLocale, trLocale]; } diff --git a/lib/core/init/lang/locale_keys.g.dart b/lib/core/init/lang/locale_keys.g.dart index 6c40724..972ff69 100644 --- a/lib/core/init/lang/locale_keys.g.dart +++ b/lib/core/init/lang/locale_keys.g.dart @@ -45,6 +45,22 @@ abstract class LocaleKeys { static const home_game_tabbar_tab5 = 'home.game.tabbar.tab5'; static const home_game_tabbar = 'home.game.tabbar'; static const home_game = 'home.game'; + static const home_burgers_favoriteProducts = 'home.burgers.favoriteProducts'; + static const home_burgers_normalProducts = 'home.burgers.normalProducts'; + static const home_burgers = 'home.burgers'; + static const home_setting_title = 'home.setting.title'; + static const home_setting_about_title = 'home.setting.about.title'; + static const home_setting_about_contribitions = 'home.setting.about.contribitions'; + static const home_setting_about = 'home.setting.about'; + static const home_setting_core_title = 'home.setting.core.title'; + static const home_setting_core_themeTitle = 'home.setting.core.themeTitle'; + static const home_setting_core_themeDesc = 'home.setting.core.themeDesc'; + static const home_setting_core_langTitle = 'home.setting.core.langTitle'; + static const home_setting_core_langDesc = 'home.setting.core.langDesc'; + static const home_setting_core = 'home.setting.core'; + static const home_setting_exit = 'home.setting.exit'; + static const home_setting_applicationTour = 'home.setting.applicationTour'; + static const home_setting = 'home.setting'; static const home = 'home'; } diff --git a/lib/core/init/navigation/navigation_route.dart b/lib/core/init/navigation/navigation_route.dart index 51a1d51..3ce8317 100644 --- a/lib/core/init/navigation/navigation_route.dart +++ b/lib/core/init/navigation/navigation_route.dart @@ -1,7 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import '../../../product/exception/navigate_model_not_found.dart'; +import '../../../view/authenticate/onboard/view/on_board_view.dart'; import '../../../view/authenticate/test/view/test_view.dart'; +import '../../../view/settings/model/settings_dynamic.dart'; +import '../../../view/settings/view/subview/settings_dynamic_view.dart'; import '../../components/card/not_found_navigation_widget.dart'; import '../../constants/navigation/navigation_constants.dart'; @@ -15,6 +19,18 @@ class NavigationRoute { switch (args.name) { case NavigationConstants.TEST_VIEW: return normalNavigate(TestsView()); + + case NavigationConstants.ON_BOARD: + return normalNavigate(OnBoardView()); + + case NavigationConstants.SETTINGS_WEB_VIEW: + if (args.arguments is SettingsDynamicModel) { + return normalNavigate(SettingsDynamicView( + model: args.arguments as SettingsDynamicModel, + )); + } + throw NavigateException(args.arguments); + default: return MaterialPageRoute( builder: (context) => NotFoundNavigationWidget(), diff --git a/lib/core/init/notifier/theme_notifer.dart b/lib/core/init/notifier/theme_notifer.dart index f997335..2e04b7f 100644 --- a/lib/core/init/notifier/theme_notifer.dart +++ b/lib/core/init/notifier/theme_notifer.dart @@ -5,6 +5,13 @@ import '../theme/app_theme_light.dart'; class ThemeNotifier extends ChangeNotifier { ThemeData _currentTheme = AppThemeLight.instance.theme; + + AppThemes _currenThemeEnum = AppThemes.LIGHT; + + /// Applicaton theme enum. + /// Deafult value is [AppThemes.LIGHT] + AppThemes get currenThemeEnum => _currenThemeEnum; + ThemeData get currentTheme => _currentTheme; void changeValue(AppThemes theme) { @@ -15,4 +22,17 @@ class ThemeNotifier extends ChangeNotifier { } notifyListeners(); } + + /// Change your app theme with [currenThemeEnum] value. + void changeTheme() { + if (_currenThemeEnum == AppThemes.LIGHT) { + _currentTheme = ThemeData.dark(); + _currenThemeEnum = AppThemes.DARK; + } else { + _currentTheme = AppThemeLight.instance.theme; + ; + _currenThemeEnum = AppThemes.LIGHT; + } + notifyListeners(); + } } diff --git a/lib/core/init/theme/app_theme_light.dart b/lib/core/init/theme/app_theme_light.dart index 67b3ac8..1351a7c 100644 --- a/lib/core/init/theme/app_theme_light.dart +++ b/lib/core/init/theme/app_theme_light.dart @@ -12,7 +12,6 @@ class AppThemeLight extends AppTheme with ILightTheme { AppThemeLight._init(); - // ThemeData get theme => redTheme; @override ThemeData get theme => ThemeData( fontFamily: ApplicationConstants.FONT_FAMILY, diff --git a/lib/main.dart b/lib/main.dart index 21f3285..cd1246f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:kartal/kartal.dart'; import 'package:provider/provider.dart'; import 'core/constants/app/app_constants.dart'; @@ -9,31 +10,35 @@ import 'core/init/navigation/navigation_route.dart'; import 'core/init/navigation/navigation_service.dart'; import 'core/init/notifier/provider_list.dart'; import 'core/init/notifier/theme_notifer.dart'; -import 'view/home/game/view/game_view.dart'; +import 'view/home/burger/view/burgers_view.dart'; Future main() async { - WidgetsFlutterBinding.ensureInitialized(); - await LocaleManager.prefrencesInit(); - - await EasyLocalization.ensureInitialized(); - + await _init(); runApp(MultiProvider( providers: [...ApplicationProvider.instance.dependItems], child: EasyLocalization( child: MyApp(), supportedLocales: LanguageManager.instance.supportedLocales, path: ApplicationConstants.LANG_ASSET_PATH, + startLocale: LanguageManager.instance.enLocale, ), )); } +Future _init() async { + WidgetsFlutterBinding.ensureInitialized(); + await LocaleManager.prefrencesInit(); + await EasyLocalization.ensureInitialized(); + await DeviceUtility.instance?.initPackageInfo(); +} + class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, - theme: Provider.of(context, listen: false).currentTheme, - home: GameView(), + theme: context.watch().currentTheme, + home: BurgersView(), localizationsDelegates: context.localizationDelegates, supportedLocales: context.supportedLocales, locale: context.locale, diff --git a/lib/product/enum/lottie_path_enum.dart b/lib/product/enum/lottie_path_enum.dart new file mode 100644 index 0000000..8d7b2f2 --- /dev/null +++ b/lib/product/enum/lottie_path_enum.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:lottie/lottie.dart'; + +enum LottiePathEnum { SUNNY, MOON } + +extension LottiePathEnumExtension on LottiePathEnum { + String get rawValue { + switch (this) { + case LottiePathEnum.MOON: + return _pathValue('moon'); + + case LottiePathEnum.SUNNY: + return _pathValue('sunny'); + } + } + + Widget get toWidget { + return Lottie.asset(rawValue); + } + + String _pathValue(String path) => 'asset/lottie/$path.json'; +} diff --git a/lib/product/exception/navigate_model_not_found.dart b/lib/product/exception/navigate_model_not_found.dart new file mode 100644 index 0000000..a197521 --- /dev/null +++ b/lib/product/exception/navigate_model_not_found.dart @@ -0,0 +1,10 @@ +class NavigateException implements Exception { + final dynamic model; + + NavigateException(this.model); + + @override + String toString() { + return 'This model variable doesnt found in route $model and $T'; + } +} diff --git a/lib/product/model/user.dart b/lib/product/model/user.dart new file mode 100644 index 0000000..8325c73 --- /dev/null +++ b/lib/product/model/user.dart @@ -0,0 +1,12 @@ +class UserModel { + final String userName; + final String userSurname; + + UserModel(this.userName, this.userSurname); + + String get shortName => '${userName[0]}${userSurname[0]}'; + String get fullName => '${userName} ${userSurname}'; + factory UserModel.fake() { + return UserModel('Veli', 'Bacik'); + } +} diff --git a/lib/product/widget/card/burger_card.dart b/lib/product/widget/card/burger_card.dart new file mode 100644 index 0000000..35db641 --- /dev/null +++ b/lib/product/widget/card/burger_card.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_rating_bar/flutter_rating_bar.dart'; + +import '../../../view/home/burger/model/burger_model.dart'; + +class BurgerCard extends StatelessWidget { + final BurgerModel? model; + + const BurgerCard({Key? key, this.model}) : super(key: key); + @override + Widget build(BuildContext context) { + return Card( + child: Column( + children: [ + Expanded(child: Image.network(model?.image ?? '')), + Text('${model?.name}'), + buildRatingBar(), + Text('${model?.price} \$'), + ], + )); + } + + RatingBar buildRatingBar() { + return RatingBar.builder( + initialRating: (model?.rates ?? 0).toDouble(), + minRating: 1, + direction: Axis.horizontal, + allowHalfRating: true, + itemCount: 5, + ignoreGestures: true, + itemSize: 10, + itemPadding: EdgeInsets.zero, + itemBuilder: (context, _) => Icon(Icons.star, color: Colors.amber), + onRatingUpdate: (rating) { + print(rating); + }, + ); + } +} + +extension BurgerCardExtension on BurgerCard { + Widget buildList(List items) { + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: items.map((e) => BurgerCard(model: e)).toList(), + ), + ); + } +} diff --git a/lib/view/_product/_mixin/network_helper.dart b/lib/view/_product/_mixin/network_helper.dart new file mode 100644 index 0000000..eb8541d --- /dev/null +++ b/lib/view/_product/_mixin/network_helper.dart @@ -0,0 +1,7 @@ +import 'package:logger/logger.dart'; + +mixin NetworkHelper { + void showLog(dynamic message) { + Logger().wtf(message); + } +} diff --git a/lib/view/_product/_utilty/burger_network_enum.dart b/lib/view/_product/_utilty/burger_network_enum.dart new file mode 100644 index 0000000..98b17cb --- /dev/null +++ b/lib/view/_product/_utilty/burger_network_enum.dart @@ -0,0 +1,59 @@ +enum BurgerSortValues { NAME, PRICE, RATES, UPDATED } +enum BurgerSortValuesType { ASC, DSC } + +enum BurgerNetworkPath { MAIN, PRICE } +enum BurgerQueryParamaters { FAVORITE, SORT, SORT_TYPE, MIN, MAX } + +extension BurgerSortValuesExtension on BurgerSortValues { + String get rawValue { + switch (this) { + case BurgerSortValues.NAME: + return 'name'; + case BurgerSortValues.PRICE: + return 'price'; + case BurgerSortValues.RATES: + return 'rates'; + case BurgerSortValues.UPDATED: + return 'updated'; + } + } +} + +extension BurgerSortValuesTypeExtension on BurgerSortValuesType { + int get rawValue { + switch (this) { + case BurgerSortValuesType.ASC: + return -1; + case BurgerSortValuesType.DSC: + return 1; + } + } +} + +extension BurgerNetworkPathExtension on BurgerNetworkPath { + String get rawValue { + switch (this) { + case BurgerNetworkPath.MAIN: + return 'burgers'; + case BurgerNetworkPath.PRICE: + return 'burgers/price'; + } + } +} + +extension BurgerQueryParamatersExtension on BurgerQueryParamaters { + MapEntry rawValue(dynamic value) { + switch (this) { + case BurgerQueryParamaters.FAVORITE: + return MapEntry('isFavorite', value); + case BurgerQueryParamaters.SORT: + return MapEntry('sort', value); + case BurgerQueryParamaters.SORT_TYPE: + return MapEntry('sortType', value); + case BurgerQueryParamaters.MIN: + return MapEntry('min', value); + case BurgerQueryParamaters.MAX: + return MapEntry('max', value); + } + } +} diff --git a/lib/view/authenticate/onboard/viewModel/on_board_view_model.dart b/lib/view/authenticate/onboard/viewModel/on_board_view_model.dart index d208ee9..a68f6be 100644 --- a/lib/view/authenticate/onboard/viewModel/on_board_view_model.dart +++ b/lib/view/authenticate/onboard/viewModel/on_board_view_model.dart @@ -44,7 +44,10 @@ abstract class _OnBoardViewModelBase with Store, BaseViewModel { changeLoading(); await localeManager.setBoolValue(PreferencesKeys.IS_FIRST_APP, true); changeLoading(); - - await navigation.navigateToPageClear(path: NavigationConstants.TEST_VIEW); + if (navigation.navigatorKey.currentState!.canPop()) { + navigation.navigatorKey.currentState!.pop(); + } else { + await navigation.navigateToPageClear(path: NavigationConstants.TEST_VIEW); + } } } diff --git a/lib/view/home/burger/model/burger_model.dart b/lib/view/home/burger/model/burger_model.dart new file mode 100644 index 0000000..ee8e6e9 --- /dev/null +++ b/lib/view/home/burger/model/burger_model.dart @@ -0,0 +1,26 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:vexana/vexana.dart'; + +part 'burger_model.g.dart'; + +@JsonSerializable() +class BurgerModel extends INetworkModel { + @JsonKey(name: '_id') + String? id; + String? image; + String? name; + int? price; + int? rates; + bool? isFavorite; + String? updated; + + @override + BurgerModel fromJson(Map json) { + return _$BurgerModelFromJson(json); + } + + @override + Map toJson() { + return _$BurgerModelToJson(this); + } +} diff --git a/lib/view/home/burger/model/burger_model.g.dart b/lib/view/home/burger/model/burger_model.g.dart new file mode 100644 index 0000000..65c8be0 --- /dev/null +++ b/lib/view/home/burger/model/burger_model.g.dart @@ -0,0 +1,29 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'burger_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +BurgerModel _$BurgerModelFromJson(Map json) { + return BurgerModel() + ..id = json['_id'] as String? + ..image = json['image'] as String? + ..name = json['name'] as String? + ..price = json['price'] as int? + ..rates = json['rates'] as int? + ..isFavorite = json['isFavorite'] as bool? + ..updated = json['updated'] as String?; +} + +Map _$BurgerModelToJson(BurgerModel instance) => + { + '_id': instance.id, + 'image': instance.image, + 'name': instance.name, + 'price': instance.price, + 'rates': instance.rates, + 'isFavorite': instance.isFavorite, + 'updated': instance.updated, + }; diff --git a/lib/view/home/burger/service/burger_serivce.dart b/lib/view/home/burger/service/burger_serivce.dart new file mode 100644 index 0000000..5f65f82 --- /dev/null +++ b/lib/view/home/burger/service/burger_serivce.dart @@ -0,0 +1,49 @@ +import 'package:vexana/vexana.dart'; + +import '../../../_product/_mixin/network_helper.dart'; +import '../../../_product/_utilty/burger_network_enum.dart'; +import '../model/burger_model.dart'; + +abstract class IBurgerService { + final INetworkManager manager; + + IBurgerService(this.manager); + + Future> fetchFavoriteBurgers(); + + Future> fetchBurgersLimited({double? max = 50, double? min = 0}); + Future> fetchBurgersSorted({required BurgerSortValues sort, BurgerSortValuesType types = BurgerSortValuesType.ASC}); +} + +class BurgerService extends IBurgerService with NetworkHelper { + BurgerService(INetworkManager manager) : super(manager); + + @override + Future> fetchBurgersLimited({double? max = 50, double? min = 0}) async { + final response = await manager.send>(BurgerNetworkPath.PRICE.rawValue, + parseModel: BurgerModel(), + method: RequestType.GET, + queryParameters: Map.fromEntries([BurgerQueryParamaters.MIN.rawValue(min?.toInt()), BurgerQueryParamaters.MAX.rawValue(max?.toInt())])); + + return response.data ?? []; + } + + @override + Future> fetchBurgersSorted({required BurgerSortValues sort, BurgerSortValuesType types = BurgerSortValuesType.ASC}) async { + final response = await manager.send>(BurgerNetworkPath.MAIN.rawValue, + parseModel: BurgerModel(), + method: RequestType.GET, + queryParameters: + Map.fromEntries([BurgerQueryParamaters.SORT.rawValue(sort.rawValue), BurgerQueryParamaters.SORT_TYPE.rawValue(types.rawValue)])); + + return response.data ?? []; + } + + @override + Future> fetchFavoriteBurgers() async { + final response = await manager.send>(BurgerNetworkPath.MAIN.rawValue, + parseModel: BurgerModel(), method: RequestType.GET, queryParameters: Map.fromEntries([BurgerQueryParamaters.FAVORITE.rawValue(true)])); + showLog(response); + return response.data ?? []; + } +} diff --git a/lib/view/home/burger/view/burgers_view.dart b/lib/view/home/burger/view/burgers_view.dart new file mode 100644 index 0000000..04f3cc4 --- /dev/null +++ b/lib/view/home/burger/view/burgers_view.dart @@ -0,0 +1,172 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:kartal/kartal.dart'; + +import '../../../../core/base/view/base_widget.dart'; +import '../../../../core/components/slider/range_price_slider.dart'; +import '../../../../core/init/lang/locale_keys.g.dart'; +import '../../../../core/init/network/vexana_manager.dart'; +import '../../../../product/widget/card/burger_card.dart'; +import '../../../_product/_utilty/burger_network_enum.dart'; +import '../service/burger_serivce.dart'; +import '../viewmodel/burger_view_model.dart'; + +enum _BurgerViews { BEST_SELL_TITLE, BURGER_FOVORITE, NORMAL_TITLE, BURGER_VIEW } + +class BurgersView extends StatelessWidget { + final _title = 'VB BURGER'; + @override + Widget build(BuildContext context) { + return BaseView( + viewModel: BurgerViewModel(BurgerService(VexanaManager.instance.networkManager)), + onModelReady: (model) { + model.setContext(context); + model.init(); + }, + onPageBuilder: (BuildContext context, BurgerViewModel viewModel) => Scaffold( + appBar: buildAppBar(context, viewModel), + body: buildObserverBuildbody(viewModel, context), + ), + ); + } + + Observer buildObserverBuildbody(BurgerViewModel viewModel, BuildContext context) { + return Observer(builder: (_) { + return viewModel.isLoading ? buildCenterLoading() : buildPaddingListView(context, viewModel); + }); + } + + Padding buildPaddingListView(BuildContext context, BurgerViewModel viewModel) { + return Padding( + padding: context.paddingLow, + child: ListView.builder( + itemCount: _BurgerViews.values.length, + itemBuilder: (context, index) { + final _views = _BurgerViews.values[index]; + switch (_views) { + case _BurgerViews.BEST_SELL_TITLE: + return buildTextBestSell(context); + case _BurgerViews.BURGER_FOVORITE: + return buildSizedBoxFavorite(context, viewModel); + case _BurgerViews.NORMAL_TITLE: + return buildPaddingNormalTitle(context); + case _BurgerViews.BURGER_VIEW: + return buildSizedBoxNormalBurgers(viewModel, context); + } + }, + ), + ); + } + + AppBar buildAppBar(BuildContext context, BurgerViewModel viewModel) { + return AppBar( + title: Text( + _title, + style: context.textTheme.headline5?.copyWith(fontWeight: FontWeight.w600, color: context.colorScheme.onError), + ), + centerTitle: false, + leading: Icon(Icons.food_bank_outlined, color: context.colorScheme.onError), + actions: [ + IconButton( + onPressed: () { + showModalBottomSheet(context: context, builder: (context) => buildBottomSheetBody(context, viewModel)); + }, + icon: Icon(Icons.filter_alt)) + ], + ); + } + + Widget buildBottomSheetBody(BuildContext context, BurgerViewModel viewModel) => Padding( + padding: context.paddingLow, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Filter'), + Divider(height: 2, thickness: 2), + Row( + children: [ + Expanded( + child: RangePriceSLider( + min: 10, + max: 50, + onCompleted: (values) { + viewModel.changeRangeValues(values); + }, + ), + ), + IconButton( + onPressed: () { + viewModel.fetchMinMax(); + }, + icon: Icon(Icons.check_box_outline_blank)) + ], + ), + Card( + child: Column( + children: [ + Wrap( + spacing: 10, + children: BurgerSortValues.values + .map((e) => IconButton( + padding: EdgeInsets.zero, + onPressed: () { + viewModel.fetchSort(e); + }, + icon: Text(e.rawValue, maxLines: 1))) + .toList(), + ), + Row( + children: [ + IconButton(onPressed: () => viewModel.changeAscending(true), icon: Icon(Icons.plus_one)), + IconButton(onPressed: () => viewModel.changeAscending(true), icon: Icon(Icons.design_services_rounded)), + ], + ), + ], + ), + ), + ], + ), + ); + + Padding buildPaddingNormalTitle(BuildContext context) { + return Padding( + padding: context.verticalPaddingLow, + child: Text(LocaleKeys.home_burgers_normalProducts.tr(), style: context.textTheme.headline5), + ); + } + + Text buildTextBestSell(BuildContext context) { + return Text( + LocaleKeys.home_burgers_favoriteProducts.tr(), + style: context.textTheme.headline3?.copyWith(color: context.colorScheme.onSecondary, fontWeight: FontWeight.bold), + ); + } + + Center buildCenterLoading() => Center(child: CircularProgressIndicator.adaptive()); + + SizedBox buildSizedBoxFavorite(BuildContext context, BurgerViewModel viewModel) => + SizedBox(height: context.dynamicHeight(0.3), child: BurgerCard().buildList(viewModel.favoriteBurgerModel)); + + Widget buildSizedBoxNormalBurgers(BurgerViewModel viewModel, BuildContext context) { + viewModel.fetchNormalItems(); + + return SizedBox( + child: Observer(builder: (_) { + return viewModel.isLoadingMain + ? SizedBox(height: context.dynamicHeight(0.1), child: buildCenterLoading()) + : GridView.builder( + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2), + itemBuilder: (context, index) { + return BurgerCard( + model: viewModel.mainBurgerModel[index], + ); + }, + itemCount: viewModel.mainBurgerModel.length, + ); + }), + ); + } +} diff --git a/lib/view/home/burger/viewmodel/burger_view_model.dart b/lib/view/home/burger/viewmodel/burger_view_model.dart new file mode 100644 index 0000000..98db86c --- /dev/null +++ b/lib/view/home/burger/viewmodel/burger_view_model.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:kartal/kartal.dart'; +import 'package:mobx/mobx.dart'; + +import '../../../../core/base/model/base_view_model.dart'; +import '../../../_product/_utilty/burger_network_enum.dart'; +import '../model/burger_model.dart'; +import '../service/burger_serivce.dart'; + +part 'burger_view_model.g.dart'; + +class BurgerViewModel = _BurgerViewModelBase with _$BurgerViewModel; + +abstract class _BurgerViewModelBase with Store, BaseViewModel { + final IBurgerService burgerService; + + _BurgerViewModelBase(this.burgerService); + + @observable + bool isLoading = false; + + @observable + bool isLoadingMain = false; + @observable + List favoriteBurgerModel = []; + @observable + List mainBurgerModel = []; + @override + void setContext(BuildContext context) => this.context = context; + + RangeValues? _values; + + bool _isAscending = true; + @override + void init() { + fetchFavorite(); + } + + @action + void _changeLoading() { + isLoading = !isLoading; + } + + @action + void _changeLoadingMain() { + isLoadingMain = !isLoadingMain; + } + + @action + Future fetchFavorite() async { + _changeLoading(); + favoriteBurgerModel = await burgerService.fetchFavoriteBurgers(); + _changeLoading(); + } + + @action + Future fetchNormalItems() async { + if (mainBurgerModel.isNotEmpty) return; + _changeLoadingMain(); + mainBurgerModel = await burgerService.fetchBurgersSorted(sort: BurgerSortValues.RATES); + _changeLoadingMain(); + } + + void changeRangeValues(RangeValues values) { + _values = values; + } + + void changeAscending(bool value) { + _isAscending = value; + } + + @action + Future fetchMinMax() async { + context?.navigation.pop(); + _changeLoadingMain(); + mainBurgerModel = await burgerService.fetchBurgersLimited(max: _values?.end, min: _values?.start); + _changeLoadingMain(); + } + + Future fetchSort(BurgerSortValues value) async { + context?.navigation.pop(); + _changeLoadingMain(); + mainBurgerModel = await burgerService.fetchBurgersSorted(sort: value, types: _isAscending ? BurgerSortValuesType.ASC : BurgerSortValuesType.DSC); + _changeLoadingMain(); + } +} diff --git a/lib/view/home/burger/viewmodel/burger_view_model.g.dart b/lib/view/home/burger/viewmodel/burger_view_model.g.dart new file mode 100644 index 0000000..f6c4ebc --- /dev/null +++ b/lib/view/home/burger/viewmodel/burger_view_model.g.dart @@ -0,0 +1,132 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'burger_view_model.dart'; + +// ************************************************************************** +// StoreGenerator +// ************************************************************************** + +// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic + +mixin _$BurgerViewModel on _BurgerViewModelBase, Store { + final _$isLoadingAtom = Atom(name: '_BurgerViewModelBase.isLoading'); + + @override + bool get isLoading { + _$isLoadingAtom.reportRead(); + return super.isLoading; + } + + @override + set isLoading(bool value) { + _$isLoadingAtom.reportWrite(value, super.isLoading, () { + super.isLoading = value; + }); + } + + final _$isLoadingMainAtom = Atom(name: '_BurgerViewModelBase.isLoadingMain'); + + @override + bool get isLoadingMain { + _$isLoadingMainAtom.reportRead(); + return super.isLoadingMain; + } + + @override + set isLoadingMain(bool value) { + _$isLoadingMainAtom.reportWrite(value, super.isLoadingMain, () { + super.isLoadingMain = value; + }); + } + + final _$favoriteBurgerModelAtom = + Atom(name: '_BurgerViewModelBase.favoriteBurgerModel'); + + @override + List get favoriteBurgerModel { + _$favoriteBurgerModelAtom.reportRead(); + return super.favoriteBurgerModel; + } + + @override + set favoriteBurgerModel(List value) { + _$favoriteBurgerModelAtom.reportWrite(value, super.favoriteBurgerModel, () { + super.favoriteBurgerModel = value; + }); + } + + final _$mainBurgerModelAtom = + Atom(name: '_BurgerViewModelBase.mainBurgerModel'); + + @override + List get mainBurgerModel { + _$mainBurgerModelAtom.reportRead(); + return super.mainBurgerModel; + } + + @override + set mainBurgerModel(List value) { + _$mainBurgerModelAtom.reportWrite(value, super.mainBurgerModel, () { + super.mainBurgerModel = value; + }); + } + + final _$fetchFavoriteAsyncAction = + AsyncAction('_BurgerViewModelBase.fetchFavorite'); + + @override + Future fetchFavorite() { + return _$fetchFavoriteAsyncAction.run(() => super.fetchFavorite()); + } + + final _$fetchNormalItemsAsyncAction = + AsyncAction('_BurgerViewModelBase.fetchNormalItems'); + + @override + Future fetchNormalItems() { + return _$fetchNormalItemsAsyncAction.run(() => super.fetchNormalItems()); + } + + final _$fetchMinMaxAsyncAction = + AsyncAction('_BurgerViewModelBase.fetchMinMax'); + + @override + Future fetchMinMax() { + return _$fetchMinMaxAsyncAction.run(() => super.fetchMinMax()); + } + + final _$_BurgerViewModelBaseActionController = + ActionController(name: '_BurgerViewModelBase'); + + @override + void _changeLoading() { + final _$actionInfo = _$_BurgerViewModelBaseActionController.startAction( + name: '_BurgerViewModelBase._changeLoading'); + try { + return super._changeLoading(); + } finally { + _$_BurgerViewModelBaseActionController.endAction(_$actionInfo); + } + } + + @override + void _changeLoadingMain() { + final _$actionInfo = _$_BurgerViewModelBaseActionController.startAction( + name: '_BurgerViewModelBase._changeLoadingMain'); + try { + return super._changeLoadingMain(); + } finally { + _$_BurgerViewModelBaseActionController.endAction(_$actionInfo); + } + } + + @override + String toString() { + return ''' +isLoading: ${isLoading}, +isLoadingMain: ${isLoadingMain}, +favoriteBurgerModel: ${favoriteBurgerModel}, +mainBurgerModel: ${mainBurgerModel} + '''; + } +} diff --git a/lib/view/home/social/viewmodel/social_view_model.dart b/lib/view/home/social/viewmodel/social_view_model.dart index f8fb65b..9ef796f 100644 --- a/lib/view/home/social/viewmodel/social_view_model.dart +++ b/lib/view/home/social/viewmodel/social_view_model.dart @@ -1,12 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:fluttermvvmtemplate/view/_product/_model/query/friend_query.dart'; -import 'package:fluttermvvmtemplate/view/_product/_utilty/thorottle_helper.dart'; import 'package:mobx/mobx.dart'; import '../../../../core/base/model/base_view_model.dart'; +import '../../../_product/_model/query/friend_query.dart'; +import '../../../_product/_utilty/thorottle_helper.dart'; import '../model/social_user_model.dart'; import '../service/ISocialService.dart'; -import '../service/socail_service.dart'; part 'social_view_model.g.dart'; diff --git a/lib/view/settings/model/settings_dynamic.dart b/lib/view/settings/model/settings_dynamic.dart new file mode 100644 index 0000000..b93289d --- /dev/null +++ b/lib/view/settings/model/settings_dynamic.dart @@ -0,0 +1,17 @@ +class SettingsDynamicModel { + final String? url; + final String title; + + SettingsDynamicModel(this.title, {this.url}); + + factory SettingsDynamicModel.fakeArchitecturePR() { + return SettingsDynamicModel('Project Contributors', + url: 'https://github.com/VB10/flutter-architecture-template/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc'); + } + + factory SettingsDynamicModel.fakeNull() { + return SettingsDynamicModel( + 'Project Contributors', + ); + } +} diff --git a/lib/view/settings/view/settings_view.dart b/lib/view/settings/view/settings_view.dart new file mode 100644 index 0000000..b9d96f2 --- /dev/null +++ b/lib/view/settings/view/settings_view.dart @@ -0,0 +1,159 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:kartal/kartal.dart'; +import 'package:provider/provider.dart'; + +import '../../../core/base/view/base_widget.dart'; +import '../../../core/constants/enums/app_theme_enum.dart'; +import '../../../core/extension/widget_extension.dart'; +import '../../../core/init/lang/language_manager.dart'; +import '../../../core/init/lang/locale_keys.g.dart'; +import '../../../core/init/notifier/theme_notifer.dart'; +import '../../../product/enum/lottie_path_enum.dart'; +import '../viewmodel/settings_view_model.dart'; + +class SettingsView extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BaseView( + viewModel: SettingsViewModel(), + onModelReady: (model) { + model.setContext(context); + model.init(); + }, + onPageBuilder: (BuildContext context, SettingsViewModel viewModel) => Scaffold( + body: Padding( + padding: context.paddingLow, + child: CustomScrollView( + slivers: [ + buildSliverAppBar(context), + buildCardUser(context, viewModel).toSliver, + context.emptySizedHeightBoxLow.toSliver, + buildBuildCardHeaderProjectCore(context, viewModel).toSliver, + context.emptySizedHeightBoxLow.toSliver, + buildCardNavigationTour(viewModel).toSliver, + context.emptySizedHeightBoxLow.toSliver, + buildCardAbout(context, viewModel).toSliver, + context.emptySizedHeightBoxNormal.toSliver, + Text( + '${''.version}', + textAlign: TextAlign.center, + style: context.textTheme.headline6?.copyWith(fontWeight: FontWeight.w100), + ).toSliver, + context.emptySizedHeightBoxNormal.toSliver, + buildTextButtonLogOut(context, viewModel).toSliver, + ], + ), + ), + ), + ); + } + + Card buildCardNavigationTour(SettingsViewModel viewModel) { + return Card( + child: ListTile( + onTap: viewModel.navigateToOnBoard, + title: Text(LocaleKeys.home_setting_applicationTour.tr()), + trailing: Icon(Icons.arrow_right), + )); + } + + TextButton buildTextButtonLogOut(BuildContext context, SettingsViewModel viewModel) { + return TextButton.icon( + style: ButtonStyle( + shape: MaterialStateProperty.all(StadiumBorder()), + padding: MaterialStateProperty.all(context.paddingNormal), + backgroundColor: MaterialStateProperty.all(context.colorScheme.onError.withOpacity(0.7))), + onPressed: viewModel.logutApp, + icon: Icon(Icons.exit_to_app), + label: Text(LocaleKeys.home_setting_exit.tr())); + } + + Widget buildBuildCardHeaderProjectCore(BuildContext context, SettingsViewModel viewModel) { + return buildCardHeader(context, viewModel, title: LocaleKeys.home_setting_core_title, children: [ + ListTile( + title: Text(LocaleKeys.home_setting_core_themeTitle.tr()), + trailing: IconButton( + icon: context.watch().currenThemeEnum == AppThemes.LIGHT ? LottiePathEnum.MOON.toWidget : LottiePathEnum.SUNNY.toWidget, + onPressed: viewModel.changeAppTheme), + subtitle: Text(LocaleKeys.home_setting_core_themeDesc), + ), + ListTile( + title: Text(LocaleKeys.home_setting_core_langTitle.tr()), + trailing: Observer(builder: (_) { + return DropdownButton(items: [ + DropdownMenuItem(child: Text(LanguageManager.instance.trLocale.countryCode!.toUpperCase()), value: LanguageManager.instance.trLocale), + DropdownMenuItem(child: Text(LanguageManager.instance.enLocale.countryCode!.toUpperCase()), value: LanguageManager.instance.enLocale), + ], onChanged: viewModel.changeAppLocalization, value: viewModel.appLocale); + }), + subtitle: Text(LocaleKeys.home_setting_core_langDesc.tr()), + ), + ]); + } + + Widget buildCardHeader(BuildContext context, SettingsViewModel viewModel, {required String title, required List children}) { + return Card( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [Padding(padding: context.paddingLow, child: Text(title.tr(), style: context.textTheme.headline5)), Divider(), ...children], + ), + ); + } + + Widget buildCardAbout(BuildContext context, SettingsViewModel viewModel) { + return buildCardHeader(context, viewModel, title: LocaleKeys.home_setting_about_title, children: [ + ListTile( + onTap: viewModel.navigateToContribution, + leading: Icon(Icons.favorite), + title: Text(LocaleKeys.home_setting_about_contribitions.tr()), + trailing: Icon(Icons.keyboard_arrow_right_outlined), + ), + ListTile( + onTap: viewModel.navigateToFakeContribution, + leading: Icon(Icons.home), + title: Text('Home Page'), + trailing: Icon(Icons.keyboard_arrow_right_outlined), + ) + ]); + } + + Card buildCardUser(BuildContext context, SettingsViewModel viewModel) { + return Card( + child: Padding( + padding: context.paddingLow, + child: Row( + children: [ + CircleAvatar(child: Text(viewModel.userModel.shortName), radius: 30), + Spacer(), + Text(viewModel.userModel.fullName), + Spacer(flex: 5), + ], + ), + ), + ); + } + + NestedScrollView buildNestedScrollView() { + return NestedScrollView( + headerSliverBuilder: (context, innerBoxIsScrolled) { + return [buildSliverAppBar(context)]; + }, + body: Column()); + } + + SliverAppBar buildSliverAppBar(BuildContext context) { + return SliverAppBar( + expandedHeight: 100, + backgroundColor: context.colorScheme.background, + pinned: true, + flexibleSpace: FlexibleSpaceBar( + centerTitle: false, + title: Text( + LocaleKeys.home_setting_title.tr(), + style: context.textTheme.headline5, + ), + ), + ); + } +} diff --git a/lib/view/settings/view/subview/settings_dynamic_view.dart b/lib/view/settings/view/subview/settings_dynamic_view.dart new file mode 100644 index 0000000..e336a61 --- /dev/null +++ b/lib/view/settings/view/subview/settings_dynamic_view.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +import 'package:kartal/kartal.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +import '../../../../core/constants/app/app_constants.dart'; +import '../../model/settings_dynamic.dart'; + +class SettingsDynamicView extends StatelessWidget { + final SettingsDynamicModel model; + + const SettingsDynamicView({Key? key, required this.model}) : super(key: key); + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(centerTitle: false, title: Text(model.title, style: context.textTheme.headline6)), + body: WebView(initialUrl: model.url ?? ApplicationConstants.APP_WEB_SITE), + ); + } +} diff --git a/lib/view/settings/viewmodel/settings_view_model.dart b/lib/view/settings/viewmodel/settings_view_model.dart new file mode 100644 index 0000000..174586a --- /dev/null +++ b/lib/view/settings/viewmodel/settings_view_model.dart @@ -0,0 +1,51 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mobx/mobx.dart'; +import 'package:provider/provider.dart'; + +import '../../../core/base/model/base_view_model.dart'; +import '../../../core/constants/navigation/navigation_constants.dart'; +import '../../../core/init/lang/language_manager.dart'; +import '../../../core/init/notifier/theme_notifer.dart'; +import '../../../product/model/user.dart'; +import '../model/settings_dynamic.dart'; + +part 'settings_view_model.g.dart'; +part 'subviewmodel/about_view_model.dart'; + +class SettingsViewModel = _SettingsViewModelBase with _$SettingsViewModel; + +abstract class _SettingsViewModelBase with Store, BaseViewModel { + final userModel = UserModel.fake(); + @override + void setContext(BuildContext context) => this.context = context; + + @observable + Locale? appLocale = LanguageManager.instance.enLocale; + + @override + void init() {} + + void changeAppTheme() { + if (context != null) { + context!.read().changeTheme(); + } + } + + @action + void changeAppLocalization(Locale? locale) { + if (locale != null) { + appLocale = locale; + context?.setLocale(locale); + } + } + + Future logutApp() async { + await localeManager.clearAllSaveFirst(); + await navigation.navigateToPageClear(path: NavigationConstants.TEST_VIEW); + } + + Future navigateToOnBoard() async { + await navigation.navigateToPage(path: NavigationConstants.ON_BOARD); + } +} diff --git a/lib/view/settings/viewmodel/settings_view_model.g.dart b/lib/view/settings/viewmodel/settings_view_model.g.dart new file mode 100644 index 0000000..b193383 --- /dev/null +++ b/lib/view/settings/viewmodel/settings_view_model.g.dart @@ -0,0 +1,47 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'settings_view_model.dart'; + +// ************************************************************************** +// StoreGenerator +// ************************************************************************** + +// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic + +mixin _$SettingsViewModel on _SettingsViewModelBase, Store { + final _$appLocaleAtom = Atom(name: '_SettingsViewModelBase.appLocale'); + + @override + Locale? get appLocale { + _$appLocaleAtom.reportRead(); + return super.appLocale; + } + + @override + set appLocale(Locale? value) { + _$appLocaleAtom.reportWrite(value, super.appLocale, () { + super.appLocale = value; + }); + } + + final _$_SettingsViewModelBaseActionController = + ActionController(name: '_SettingsViewModelBase'); + + @override + void changeAppLocalization(Locale? locale) { + final _$actionInfo = _$_SettingsViewModelBaseActionController.startAction( + name: '_SettingsViewModelBase.changeAppLocalization'); + try { + return super.changeAppLocalization(locale); + } finally { + _$_SettingsViewModelBaseActionController.endAction(_$actionInfo); + } + } + + @override + String toString() { + return ''' +appLocale: ${appLocale} + '''; + } +} diff --git a/lib/view/settings/viewmodel/subviewmodel/about_view_model.dart b/lib/view/settings/viewmodel/subviewmodel/about_view_model.dart new file mode 100644 index 0000000..d9818e2 --- /dev/null +++ b/lib/view/settings/viewmodel/subviewmodel/about_view_model.dart @@ -0,0 +1,11 @@ +part of '../settings_view_model.dart'; + +extension SettingsViewModelBaseNavigate on _SettingsViewModelBase { + void navigateToContribution() { + navigation.navigateToPage(path: NavigationConstants.SETTINGS_WEB_VIEW, data: SettingsDynamicModel.fakeArchitecturePR()); + } + + void navigateToFakeContribution() { + navigation.navigateToPage(path: NavigationConstants.SETTINGS_WEB_VIEW, data: SettingsDynamicModel.fakeNull()); + } +} diff --git a/pubspec.lock b/pubspec.lock index b2fb95a..16f7fcd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,14 +7,14 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "18.0.0" + version: "20.0.0" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.4.0" animations: dependency: "direct main" description: @@ -42,7 +42,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.5.0" + version: "2.6.1" auto_size_text: dependency: "direct main" description: @@ -119,7 +119,7 @@ packages: name: cached_network_image url: "https://pub.dartlang.org" source: hosted - version: "3.0.0-nullsafety" + version: "3.0.0" characters: dependency: transitive description: @@ -182,7 +182,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" cupertino_icons: dependency: "direct main" description: @@ -214,12 +214,10 @@ packages: dio: dependency: transitive description: - path: dio - ref: "4.0" - resolved-ref: "10c180a2f14be495bc001f875bb523bd990b6c25" - url: "https://github.com/VB10/dio" - source: git - version: "4.0.0-prev3" + name: dio + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" easy_localization: dependency: "direct main" description: @@ -273,14 +271,14 @@ packages: name: flutter_blurhash url: "https://pub.dartlang.org" source: hosted - version: "0.5.4-nullsafety.0" + version: "0.6.0" flutter_cache_manager: dependency: transitive description: name: flutter_cache_manager url: "https://pub.dartlang.org" source: hosted - version: "3.0.0-nullsafety.2" + version: "3.0.1" flutter_localizations: dependency: transitive description: flutter @@ -292,14 +290,21 @@ packages: name: flutter_mobx url: "https://pub.dartlang.org" source: hosted - version: "2.0.0-nullsafety.3" + version: "2.0.0" + flutter_rating_bar: + dependency: "direct main" + description: + name: flutter_rating_bar + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" flutter_svg: dependency: "direct main" description: name: flutter_svg url: "https://pub.dartlang.org" source: hosted - version: "0.21.0-nullsafety.0" + version: "0.21.0+1" flutter_test: dependency: "direct dev" description: flutter @@ -316,7 +321,7 @@ packages: name: glob url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.1" graphs: dependency: transitive description: @@ -394,13 +399,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" + logger: + dependency: "direct main" + description: + name: logger + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" logging: dependency: transitive description: name: logging url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.1" + lottie: + dependency: "direct main" + description: + name: lottie + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" mask_text_input_formatter: dependency: transitive description: @@ -435,14 +454,14 @@ packages: name: mobx url: "https://pub.dartlang.org" source: hosted - version: "2.0.0-nullsafety.5" + version: "2.0.1" mobx_codegen: dependency: "direct main" description: name: mobx_codegen url: "https://pub.dartlang.org" source: hosted - version: "2.0.0-nullsafety.2" + version: "2.0.1+3" mockito: dependency: "direct main" description: @@ -463,7 +482,7 @@ packages: name: octo_image url: "https://pub.dartlang.org" source: hosted - version: "1.0.0-nullsafety.1" + version: "1.0.0+1" package_config: dependency: transitive description: @@ -491,14 +510,14 @@ packages: name: path_drawing url: "https://pub.dartlang.org" source: hosted - version: "0.5.0-nullsafety.0" + version: "0.5.0" path_parsing: dependency: transitive description: name: path_parsing url: "https://pub.dartlang.org" source: hosted - version: "0.2.0-nullsafety.0" + version: "0.2.0" path_provider: dependency: transitive description: @@ -547,7 +566,7 @@ packages: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "4.0.2" + version: "4.1.0" platform: dependency: transitive description: @@ -575,7 +594,7 @@ packages: name: process url: "https://pub.dartlang.org" source: hosted - version: "4.1.1" + version: "4.2.1" provider: dependency: "direct main" description: @@ -617,7 +636,7 @@ packages: name: sembast url: "https://pub.dartlang.org" source: hosted - version: "3.0.0+4" + version: "3.0.1" share: dependency: transitive description: @@ -687,7 +706,7 @@ packages: name: shimmer url: "https://pub.dartlang.org" source: hosted - version: "2.0.0-nullsafety.0" + version: "2.0.0" sky_engine: dependency: transitive description: flutter @@ -706,7 +725,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" sqflite: dependency: transitive description: @@ -769,7 +788,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.19" + version: "0.3.0" timing: dependency: transitive description: @@ -790,7 +809,7 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.2" + version: "6.0.3" url_launcher_linux: dependency: transitive description: @@ -832,7 +851,7 @@ packages: name: uuid url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.0.4" vector_math: dependency: transitive description: @@ -843,12 +862,10 @@ packages: vexana: dependency: "direct main" description: - path: "." - ref: "feature/web_supprt_nosql" - resolved-ref: "70d038dc23d3382ee1c31526179053f400386bb4" - url: "https://github.com/VB10/vexana" - source: git - version: "2.1.0" + name: vexana + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" watcher: dependency: transitive description: @@ -863,13 +880,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" + webview_flutter: + dependency: "direct main" + description: + name: webview_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.4" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "2.0.5" xdg_directories: dependency: transitive description: @@ -883,7 +907,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.0.2" + version: "5.1.0" yaml: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 03f9416..49e63de 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,22 +31,23 @@ dependencies: # dio: ^4.0.0-prev3 # vexana has a package easy_localization: ^3.0.0 - flutter_mobx: ^2.0.0-nullsafety.3 + flutter_mobx: ^2.0.0 + flutter_rating_bar: ^4.0.0 flutter_svg: ^0.21.0-nullsafety.0 json_annotation: ^4.0.1 json_serializable: ^4.1.0 kartal: ^2.0.0 - mobx: ^2.0.0-nullsafety.5 - mobx_codegen: ^2.0.0-nullsafety.2 + mobx: ^2.0.1 + mobx_codegen: ^2.0.1+3 mockito: any pedantic: ^1.11.0 provider: ^5.0.0 + lottie: ^1.0.1 shared_preferences: ^2.0.5 shimmer: ^2.0.0-nullsafety.0 - vexana: - git: - url: https://github.com/VB10/vexana - ref: feature/web_supprt_nosql + vexana: ^2.2.0 + webview_flutter: ^2.0.4 + logger: ^1.0.0 dev_dependencies: flutter_test: @@ -66,6 +67,7 @@ flutter: - asset/lang/ - asset/svg/ - asset/image/ + - asset/lottie/ # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware. # For details regarding adding assets from package dependencies, see diff --git a/test/feature/burger/burger_test.dart b/test/feature/burger/burger_test.dart new file mode 100644 index 0000000..a7f376d --- /dev/null +++ b/test/feature/burger/burger_test.dart @@ -0,0 +1,28 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:fluttermvvmtemplate/core/init/network/vexana_manager.dart'; +import 'package:fluttermvvmtemplate/view/_product/_utilty/burger_network_enum.dart'; +import 'package:fluttermvvmtemplate/view/home/burger/service/burger_serivce.dart'; + +void main() { + IBurgerService? burgerService; + setUp(() { + burgerService = BurgerService(VexanaManager.instance.networkManager); + }); + test('Fetch favorite Burgers', () async { + final response = await burgerService?.fetchFavoriteBurgers(); + + expect(response, isNotEmpty); + }); + + test('Fetch min 20 max 30 service', () async { + final response = await burgerService?.fetchBurgersLimited(min: 20, max: 30); + + expect(response, isNotEmpty); + }); + + test('Fetch sort rate', () async { + final response = await burgerService?.fetchBurgersSorted(sort: BurgerSortValues.RATES); + + expect(response, isNotEmpty); + }); +}