client-side works fully again

Orual ec7d916e 27f77851

+1256 -551
+652 -127
Cargo.lock
··· 1044 1044 1045 1045 [[package]] 1046 1046 name = "const-serialize" 1047 + version = "0.6.2" 1048 + source = "registry+https://github.com/rust-lang/crates.io-index" 1049 + checksum = "08259976d62c715c4826cb4a3d64a3a9e5c5f68f964ff6087319857f569f93a6" 1050 + dependencies = [ 1051 + "const-serialize-macro 0.6.2", 1052 + "serde", 1053 + ] 1054 + 1055 + [[package]] 1056 + name = "const-serialize" 1047 1057 version = "0.7.1" 1048 1058 source = "registry+https://github.com/rust-lang/crates.io-index" 1049 1059 checksum = "fd339aa356cc6452308fad2ee56623f900a8e68bc0ab9360a0ddb8270e5640c8" 1050 1060 dependencies = [ 1051 - "const-serialize-macro", 1061 + "const-serialize-macro 0.7.1", 1052 1062 "serde", 1063 + ] 1064 + 1065 + [[package]] 1066 + name = "const-serialize-macro" 1067 + version = "0.6.2" 1068 + source = "registry+https://github.com/rust-lang/crates.io-index" 1069 + checksum = "04382d0d9df7434af6b1b49ea1a026ef39df1b0738b1cc373368cf175354f6eb" 1070 + dependencies = [ 1071 + "proc-macro2", 1072 + "quote", 1073 + "syn 2.0.110", 1053 1074 ] 1054 1075 1055 1076 [[package]] ··· 1112 1133 1113 1134 [[package]] 1114 1135 name = "convert_case" 1136 + version = "0.6.0" 1137 + source = "registry+https://github.com/rust-lang/crates.io-index" 1138 + checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" 1139 + dependencies = [ 1140 + "unicode-segmentation", 1141 + ] 1142 + 1143 + [[package]] 1144 + name = "convert_case" 1115 1145 version = "0.8.0" 1116 1146 source = "registry+https://github.com/rust-lang/crates.io-index" 1117 1147 checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" ··· 1403 1433 1404 1434 [[package]] 1405 1435 name = "dashmap" 1436 + version = "5.5.3" 1437 + source = "registry+https://github.com/rust-lang/crates.io-index" 1438 + checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" 1439 + dependencies = [ 1440 + "cfg-if", 1441 + "hashbrown 0.14.5", 1442 + "lock_api", 1443 + "once_cell", 1444 + "parking_lot_core", 1445 + ] 1446 + 1447 + [[package]] 1448 + name = "dashmap" 1406 1449 version = "6.1.0" 1407 1450 source = "registry+https://github.com/rust-lang/crates.io-index" 1408 1451 checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" ··· 1627 1670 1628 1671 [[package]] 1629 1672 name = "dioxus" 1673 + version = "0.6.3" 1674 + source = "registry+https://github.com/rust-lang/crates.io-index" 1675 + checksum = "60a247114500f1a78e87022defa8173de847accfada8e8809dfae23a118a580c" 1676 + dependencies = [ 1677 + "dioxus-cli-config 0.6.3", 1678 + "dioxus-config-macro 0.6.2", 1679 + "dioxus-core 0.6.3", 1680 + "dioxus-core-macro 0.6.3", 1681 + "dioxus-devtools 0.6.2", 1682 + "dioxus-document 0.6.3", 1683 + "dioxus-fullstack 0.6.3", 1684 + "dioxus-history 0.6.2", 1685 + "dioxus-hooks 0.6.2", 1686 + "dioxus-html 0.6.3", 1687 + "dioxus-logger 0.6.2", 1688 + "dioxus-signals 0.6.3", 1689 + "dioxus-web 0.6.3", 1690 + "manganis 0.6.2", 1691 + "warnings", 1692 + ] 1693 + 1694 + [[package]] 1695 + name = "dioxus" 1630 1696 version = "0.7.1" 1631 1697 source = "registry+https://github.com/rust-lang/crates.io-index" 1632 1698 checksum = "f76e820919058a685a1fdbb2ef4888c73ac77d623c39a7dfde2aa812947246be" 1633 1699 dependencies = [ 1634 1700 "dioxus-asset-resolver", 1635 - "dioxus-cli-config", 1636 - "dioxus-config-macro", 1701 + "dioxus-cli-config 0.7.1", 1702 + "dioxus-config-macro 0.7.1", 1637 1703 "dioxus-config-macros", 1638 - "dioxus-core", 1639 - "dioxus-core-macro", 1704 + "dioxus-core 0.7.1", 1705 + "dioxus-core-macro 0.7.1", 1640 1706 "dioxus-desktop", 1641 - "dioxus-devtools", 1642 - "dioxus-document", 1643 - "dioxus-fullstack", 1707 + "dioxus-devtools 0.7.1", 1708 + "dioxus-document 0.7.1", 1709 + "dioxus-fullstack 0.7.1", 1644 1710 "dioxus-fullstack-macro", 1645 - "dioxus-history", 1646 - "dioxus-hooks", 1647 - "dioxus-html", 1711 + "dioxus-history 0.7.1", 1712 + "dioxus-hooks 0.7.1", 1713 + "dioxus-html 0.7.1", 1648 1714 "dioxus-liveview", 1649 - "dioxus-logger", 1715 + "dioxus-logger 0.7.1", 1650 1716 "dioxus-router", 1651 1717 "dioxus-server", 1652 - "dioxus-signals", 1718 + "dioxus-signals 0.7.1", 1653 1719 "dioxus-ssr", 1654 1720 "dioxus-stores", 1655 - "dioxus-web", 1656 - "manganis", 1721 + "dioxus-web 0.7.1", 1722 + "manganis 0.7.1", 1657 1723 "serde", 1658 1724 "subsecond", 1659 1725 "warnings", ··· 1666 1732 source = "registry+https://github.com/rust-lang/crates.io-index" 1667 1733 checksum = "7f6a124667ce5565c39fe2f33af45c21fe459c5bfcf7a8074ad12c9e9da5817c" 1668 1734 dependencies = [ 1669 - "dioxus-cli-config", 1735 + "dioxus-cli-config 0.7.1", 1670 1736 "http", 1671 1737 "infer", 1672 1738 "jni", ··· 1683 1749 1684 1750 [[package]] 1685 1751 name = "dioxus-cli-config" 1752 + version = "0.6.3" 1753 + source = "registry+https://github.com/rust-lang/crates.io-index" 1754 + checksum = "cdd16948f1ffdb068dd9a64812158073a4250e2af4e98ea31fdac0312e6bce86" 1755 + dependencies = [ 1756 + "wasm-bindgen", 1757 + ] 1758 + 1759 + [[package]] 1760 + name = "dioxus-cli-config" 1686 1761 version = "0.7.1" 1687 1762 source = "registry+https://github.com/rust-lang/crates.io-index" 1688 1763 checksum = "babc8eaf90379352bc4820830749fd231feb9312433d4094b4e7b79d912b3d96" ··· 1692 1767 1693 1768 [[package]] 1694 1769 name = "dioxus-config-macro" 1770 + version = "0.6.2" 1771 + source = "registry+https://github.com/rust-lang/crates.io-index" 1772 + checksum = "75cbf582fbb1c32d34a1042ea675469065574109c95154468710a4d73ee98b49" 1773 + dependencies = [ 1774 + "proc-macro2", 1775 + "quote", 1776 + ] 1777 + 1778 + [[package]] 1779 + name = "dioxus-config-macro" 1695 1780 version = "0.7.1" 1696 1781 source = "registry+https://github.com/rust-lang/crates.io-index" 1697 1782 checksum = "30018b5b95567cee42febbb444d5e5e47dbe3e91fa6e44b9e571edad0184cd36" ··· 1708 1793 1709 1794 [[package]] 1710 1795 name = "dioxus-core" 1796 + version = "0.6.3" 1797 + source = "registry+https://github.com/rust-lang/crates.io-index" 1798 + checksum = "9c03f451a119e47433c16e2d8eb5b15bf7d6e6734eb1a4c47574e6711dadff8d" 1799 + dependencies = [ 1800 + "const_format", 1801 + "dioxus-core-types 0.6.2", 1802 + "futures-channel", 1803 + "futures-util", 1804 + "generational-box 0.6.2", 1805 + "longest-increasing-subsequence", 1806 + "rustc-hash 1.1.0", 1807 + "rustversion", 1808 + "serde", 1809 + "slab", 1810 + "slotmap", 1811 + "tracing", 1812 + "warnings", 1813 + ] 1814 + 1815 + [[package]] 1816 + name = "dioxus-core" 1711 1817 version = "0.7.1" 1712 1818 source = "registry+https://github.com/rust-lang/crates.io-index" 1713 1819 checksum = "75468d08468919f783b0f7ee826802f4e8e66c5b5a0451245d861c211ca18216" 1714 1820 dependencies = [ 1715 1821 "anyhow", 1716 1822 "const_format", 1717 - "dioxus-core-types", 1823 + "dioxus-core-types 0.7.1", 1718 1824 "futures-channel", 1719 1825 "futures-util", 1720 - "generational-box", 1826 + "generational-box 0.7.1", 1721 1827 "longest-increasing-subsequence", 1722 1828 "rustc-hash 2.1.1", 1723 1829 "rustversion", ··· 1731 1837 1732 1838 [[package]] 1733 1839 name = "dioxus-core-macro" 1840 + version = "0.6.3" 1841 + source = "registry+https://github.com/rust-lang/crates.io-index" 1842 + checksum = "105c954caaaedf8cd10f3d1ba576b01e18aa8d33ad435182125eefe488cf0064" 1843 + dependencies = [ 1844 + "convert_case 0.6.0", 1845 + "dioxus-rsx 0.6.2", 1846 + "proc-macro2", 1847 + "quote", 1848 + "syn 2.0.110", 1849 + ] 1850 + 1851 + [[package]] 1852 + name = "dioxus-core-macro" 1734 1853 version = "0.7.1" 1735 1854 source = "registry+https://github.com/rust-lang/crates.io-index" 1736 1855 checksum = "f145abdb2a3f858456cb4382390863cf0398c228ad0733618f48891da7687be3" 1737 1856 dependencies = [ 1738 1857 "convert_case 0.8.0", 1739 - "dioxus-rsx", 1858 + "dioxus-rsx 0.7.1", 1740 1859 "proc-macro2", 1741 1860 "quote", 1742 1861 "syn 2.0.110", ··· 1744 1863 1745 1864 [[package]] 1746 1865 name = "dioxus-core-types" 1866 + version = "0.6.2" 1867 + source = "registry+https://github.com/rust-lang/crates.io-index" 1868 + checksum = "91a82fccfa48574eb7aa183e297769540904694844598433a9eb55896ad9f93b" 1869 + dependencies = [ 1870 + "once_cell", 1871 + ] 1872 + 1873 + [[package]] 1874 + name = "dioxus-core-types" 1747 1875 version = "0.7.1" 1748 1876 source = "registry+https://github.com/rust-lang/crates.io-index" 1749 1877 checksum = "36f5ecf5a51de06d78aded3b5f7516a258f53117cba718bc5706317a3c04c844" ··· 1760 1888 "cocoa", 1761 1889 "core-foundation 0.10.1", 1762 1890 "dioxus-asset-resolver", 1763 - "dioxus-cli-config", 1764 - "dioxus-core", 1765 - "dioxus-devtools", 1766 - "dioxus-document", 1767 - "dioxus-history", 1768 - "dioxus-hooks", 1769 - "dioxus-html", 1770 - "dioxus-interpreter-js", 1771 - "dioxus-signals", 1891 + "dioxus-cli-config 0.7.1", 1892 + "dioxus-core 0.7.1", 1893 + "dioxus-devtools 0.7.1", 1894 + "dioxus-document 0.7.1", 1895 + "dioxus-history 0.7.1", 1896 + "dioxus-hooks 0.7.1", 1897 + "dioxus-html 0.7.1", 1898 + "dioxus-interpreter-js 0.7.1", 1899 + "dioxus-signals 0.7.1", 1772 1900 "dunce", 1773 1901 "futures-channel", 1774 1902 "futures-util", 1775 - "generational-box", 1903 + "generational-box 0.7.1", 1776 1904 "global-hotkey", 1777 1905 "infer", 1778 1906 "jni", ··· 1805 1933 1806 1934 [[package]] 1807 1935 name = "dioxus-devtools" 1936 + version = "0.6.2" 1937 + source = "registry+https://github.com/rust-lang/crates.io-index" 1938 + checksum = "712a7300f1e8181218187b03502044157eef04e0a25b518117c5ef9ae1096880" 1939 + dependencies = [ 1940 + "dioxus-core 0.6.3", 1941 + "dioxus-devtools-types 0.6.2", 1942 + "dioxus-signals 0.6.3", 1943 + "serde", 1944 + "serde_json", 1945 + "tracing", 1946 + "tungstenite 0.23.0", 1947 + "warnings", 1948 + ] 1949 + 1950 + [[package]] 1951 + name = "dioxus-devtools" 1808 1952 version = "0.7.1" 1809 1953 source = "registry+https://github.com/rust-lang/crates.io-index" 1810 1954 checksum = "4eb2c5019b7fa72e8e6b21ba99e9263bd390c9a30bbf09793b72f4b57ed7c3d7" 1811 1955 dependencies = [ 1812 - "dioxus-cli-config", 1813 - "dioxus-core", 1814 - "dioxus-devtools-types", 1815 - "dioxus-signals", 1956 + "dioxus-cli-config 0.7.1", 1957 + "dioxus-core 0.7.1", 1958 + "dioxus-devtools-types 0.7.1", 1959 + "dioxus-signals 0.7.1", 1816 1960 "futures-channel", 1817 1961 "futures-util", 1818 1962 "serde", ··· 1822 1966 "tracing", 1823 1967 "tungstenite 0.27.0", 1824 1968 "warnings", 1969 + ] 1970 + 1971 + [[package]] 1972 + name = "dioxus-devtools-types" 1973 + version = "0.6.2" 1974 + source = "registry+https://github.com/rust-lang/crates.io-index" 1975 + checksum = "f62434973c0c9c5a3bc42e9cd5e7070401c2062a437fb5528f318c3e42ebf4ff" 1976 + dependencies = [ 1977 + "dioxus-core 0.6.3", 1978 + "serde", 1825 1979 ] 1826 1980 1827 1981 [[package]] ··· 1830 1984 source = "registry+https://github.com/rust-lang/crates.io-index" 1831 1985 checksum = "7b007cec5b8548281921c4e4678926a3936e9d6757e951380685cc6121a6f974" 1832 1986 dependencies = [ 1833 - "dioxus-core", 1987 + "dioxus-core 0.7.1", 1834 1988 "serde", 1835 1989 "subsecond-types", 1836 1990 ] 1837 1991 1838 1992 [[package]] 1839 1993 name = "dioxus-document" 1994 + version = "0.6.3" 1995 + source = "registry+https://github.com/rust-lang/crates.io-index" 1996 + checksum = "802a2014d1662b6615eec0a275745822ee4fc66aacd9d0f2fb33d6c8da79b8f2" 1997 + dependencies = [ 1998 + "dioxus-core 0.6.3", 1999 + "dioxus-core-macro 0.6.3", 2000 + "dioxus-core-types 0.6.2", 2001 + "dioxus-html 0.6.3", 2002 + "futures-channel", 2003 + "futures-util", 2004 + "generational-box 0.6.2", 2005 + "lazy-js-bundle 0.6.2", 2006 + "serde", 2007 + "serde_json", 2008 + "tracing", 2009 + ] 2010 + 2011 + [[package]] 2012 + name = "dioxus-document" 1840 2013 version = "0.7.1" 1841 2014 source = "registry+https://github.com/rust-lang/crates.io-index" 1842 2015 checksum = "8c55bcae9aaf150d4a141c61b3826da5a7ac23dfff09726568525cd46336e9a2" 1843 2016 dependencies = [ 1844 - "dioxus-core", 1845 - "dioxus-core-macro", 1846 - "dioxus-core-types", 1847 - "dioxus-html", 2017 + "dioxus-core 0.7.1", 2018 + "dioxus-core-macro 0.7.1", 2019 + "dioxus-core-types 0.7.1", 2020 + "dioxus-html 0.7.1", 1848 2021 "futures-channel", 1849 2022 "futures-util", 1850 - "generational-box", 2023 + "generational-box 0.7.1", 1851 2024 "lazy-js-bundle 0.7.1", 1852 2025 "serde", 1853 2026 "serde_json", ··· 1855 2028 ] 1856 2029 1857 2030 [[package]] 2031 + name = "dioxus-free-icons" 2032 + version = "0.9.0" 2033 + source = "registry+https://github.com/rust-lang/crates.io-index" 2034 + checksum = "cd226c24168bb63d12d69cc0e7a6d73faa970574445c8e79c29965892f1a2ad8" 2035 + dependencies = [ 2036 + "dioxus 0.6.3", 2037 + ] 2038 + 2039 + [[package]] 2040 + name = "dioxus-fullstack" 2041 + version = "0.6.3" 2042 + source = "registry+https://github.com/rust-lang/crates.io-index" 2043 + checksum = "fe99b48a1348eec385b5c4bd3e80fd863b0d3b47257d34e2ddc58754dec5d128" 2044 + dependencies = [ 2045 + "base64 0.22.1", 2046 + "bytes", 2047 + "ciborium", 2048 + "dioxus-devtools 0.6.2", 2049 + "dioxus-history 0.6.2", 2050 + "dioxus-lib", 2051 + "dioxus-web 0.6.3", 2052 + "dioxus_server_macro", 2053 + "futures-channel", 2054 + "futures-util", 2055 + "generational-box 0.6.2", 2056 + "once_cell", 2057 + "serde", 2058 + "server_fn", 2059 + "tracing", 2060 + ] 2061 + 2062 + [[package]] 1858 2063 name = "dioxus-fullstack" 1859 2064 version = "0.7.1" 1860 2065 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1874 2079 "content_disposition", 1875 2080 "derive_more 2.0.1", 1876 2081 "dioxus-asset-resolver", 1877 - "dioxus-cli-config", 1878 - "dioxus-core", 2082 + "dioxus-cli-config 0.7.1", 2083 + "dioxus-core 0.7.1", 1879 2084 "dioxus-fullstack-core", 1880 2085 "dioxus-fullstack-macro", 1881 - "dioxus-hooks", 1882 - "dioxus-html", 1883 - "dioxus-signals", 2086 + "dioxus-hooks 0.7.1", 2087 + "dioxus-html 0.7.1", 2088 + "dioxus-signals 0.7.1", 1884 2089 "form_urlencoded", 1885 2090 "futures", 1886 2091 "futures-channel", ··· 1899 2104 "send_wrapper", 1900 2105 "serde", 1901 2106 "serde_json", 1902 - "serde_qs", 2107 + "serde_qs 0.15.0", 1903 2108 "serde_urlencoded", 1904 2109 "thiserror 2.0.17", 1905 2110 "tokio", ··· 1929 2134 "axum-core", 1930 2135 "base64 0.22.1", 1931 2136 "ciborium", 1932 - "dioxus-core", 1933 - "dioxus-document", 1934 - "dioxus-history", 1935 - "dioxus-hooks", 1936 - "dioxus-signals", 2137 + "dioxus-core 0.7.1", 2138 + "dioxus-document 0.7.1", 2139 + "dioxus-history 0.7.1", 2140 + "dioxus-hooks 0.7.1", 2141 + "dioxus-signals 0.7.1", 1937 2142 "futures-channel", 1938 2143 "futures-util", 1939 - "generational-box", 2144 + "generational-box 0.7.1", 1940 2145 "http", 1941 2146 "inventory", 1942 2147 "parking_lot", ··· 1963 2168 1964 2169 [[package]] 1965 2170 name = "dioxus-history" 2171 + version = "0.6.2" 2172 + source = "registry+https://github.com/rust-lang/crates.io-index" 2173 + checksum = "5ae4e22616c698f35b60727313134955d885de2d32e83689258e586ebc9b7909" 2174 + dependencies = [ 2175 + "dioxus-core 0.6.3", 2176 + "tracing", 2177 + ] 2178 + 2179 + [[package]] 2180 + name = "dioxus-history" 1966 2181 version = "0.7.1" 1967 2182 source = "registry+https://github.com/rust-lang/crates.io-index" 1968 2183 checksum = "dac73657da5c7a20629482d774b52f4a4f7cb57a520649f1d855d4073e809c98" 1969 2184 dependencies = [ 1970 - "dioxus-core", 2185 + "dioxus-core 0.7.1", 1971 2186 "tracing", 1972 2187 ] 1973 2188 1974 2189 [[package]] 1975 2190 name = "dioxus-hooks" 2191 + version = "0.6.2" 2192 + source = "registry+https://github.com/rust-lang/crates.io-index" 2193 + checksum = "948e2b3f20d9d4b2c300aaa60281b1755f3298684448920b27106da5841896d0" 2194 + dependencies = [ 2195 + "dioxus-core 0.6.3", 2196 + "dioxus-signals 0.6.3", 2197 + "futures-channel", 2198 + "futures-util", 2199 + "generational-box 0.6.2", 2200 + "rustversion", 2201 + "slab", 2202 + "tracing", 2203 + "warnings", 2204 + ] 2205 + 2206 + [[package]] 2207 + name = "dioxus-hooks" 1976 2208 version = "0.7.1" 1977 2209 source = "registry+https://github.com/rust-lang/crates.io-index" 1978 2210 checksum = "7ffd445f16d64939e06cd71a1c63a665f383fda6b7882f4c6f8f1bd6efca2046" 1979 2211 dependencies = [ 1980 - "dioxus-core", 1981 - "dioxus-signals", 2212 + "dioxus-core 0.7.1", 2213 + "dioxus-signals 0.7.1", 1982 2214 "futures-channel", 1983 2215 "futures-util", 1984 - "generational-box", 2216 + "generational-box 0.7.1", 1985 2217 "rustversion", 1986 2218 "slab", 1987 2219 "tracing", ··· 1990 2222 1991 2223 [[package]] 1992 2224 name = "dioxus-html" 2225 + version = "0.6.3" 2226 + source = "registry+https://github.com/rust-lang/crates.io-index" 2227 + checksum = "59c9a40e6fee20ce7990095492dedb6a753eebe05e67d28271a249de74dc796d" 2228 + dependencies = [ 2229 + "async-trait", 2230 + "dioxus-core 0.6.3", 2231 + "dioxus-core-macro 0.6.3", 2232 + "dioxus-core-types 0.6.2", 2233 + "dioxus-hooks 0.6.2", 2234 + "dioxus-html-internal-macro 0.6.2", 2235 + "enumset", 2236 + "euclid", 2237 + "futures-channel", 2238 + "generational-box 0.6.2", 2239 + "keyboard-types", 2240 + "lazy-js-bundle 0.6.2", 2241 + "rustversion", 2242 + "tracing", 2243 + ] 2244 + 2245 + [[package]] 2246 + name = "dioxus-html" 1993 2247 version = "0.7.1" 1994 2248 source = "registry+https://github.com/rust-lang/crates.io-index" 1995 2249 checksum = "9f407fc73a9554a644872fcccc9faf762acad8f45158e3d67e42ab8dd42f4586" 1996 2250 dependencies = [ 1997 2251 "async-trait", 1998 2252 "bytes", 1999 - "dioxus-core", 2000 - "dioxus-core-macro", 2001 - "dioxus-core-types", 2002 - "dioxus-hooks", 2003 - "dioxus-html-internal-macro", 2253 + "dioxus-core 0.7.1", 2254 + "dioxus-core-macro 0.7.1", 2255 + "dioxus-core-types 0.7.1", 2256 + "dioxus-hooks 0.7.1", 2257 + "dioxus-html-internal-macro 0.7.1", 2004 2258 "enumset", 2005 2259 "euclid", 2006 2260 "futures-channel", 2007 2261 "futures-util", 2008 - "generational-box", 2262 + "generational-box 0.7.1", 2009 2263 "keyboard-types", 2010 2264 "lazy-js-bundle 0.7.1", 2011 2265 "rustversion", ··· 2017 2271 2018 2272 [[package]] 2019 2273 name = "dioxus-html-internal-macro" 2274 + version = "0.6.2" 2275 + source = "registry+https://github.com/rust-lang/crates.io-index" 2276 + checksum = "43ba87b53688a2c9f619ecdf4b3b955bc1f08bd0570a80a0d626c405f6d14a76" 2277 + dependencies = [ 2278 + "convert_case 0.6.0", 2279 + "proc-macro2", 2280 + "quote", 2281 + "syn 2.0.110", 2282 + ] 2283 + 2284 + [[package]] 2285 + name = "dioxus-html-internal-macro" 2020 2286 version = "0.7.1" 2021 2287 source = "registry+https://github.com/rust-lang/crates.io-index" 2022 2288 checksum = "a968aae4bc92de87cbac3d0d043803b25a7c62c187841e61adcc9b49917c2b2a" ··· 2029 2295 2030 2296 [[package]] 2031 2297 name = "dioxus-interpreter-js" 2298 + version = "0.6.2" 2299 + source = "registry+https://github.com/rust-lang/crates.io-index" 2300 + checksum = "330707b10ca75cb0eb05f9e5f8d80217cd0d7e62116a8277ae363c1a09b57a22" 2301 + dependencies = [ 2302 + "js-sys", 2303 + "lazy-js-bundle 0.6.2", 2304 + "rustc-hash 1.1.0", 2305 + "sledgehammer_bindgen", 2306 + "sledgehammer_utils", 2307 + "wasm-bindgen", 2308 + "wasm-bindgen-futures", 2309 + "web-sys", 2310 + ] 2311 + 2312 + [[package]] 2313 + name = "dioxus-interpreter-js" 2032 2314 version = "0.7.1" 2033 2315 source = "registry+https://github.com/rust-lang/crates.io-index" 2034 2316 checksum = "83ab170d89308399205f8ad3d43d8d419affe317016b41ca0695186f7593cba2" 2035 2317 dependencies = [ 2036 - "dioxus-core", 2037 - "dioxus-core-types", 2038 - "dioxus-html", 2318 + "dioxus-core 0.7.1", 2319 + "dioxus-core-types 0.7.1", 2320 + "dioxus-html 0.7.1", 2039 2321 "js-sys", 2040 2322 "lazy-js-bundle 0.7.1", 2041 2323 "rustc-hash 2.1.1", ··· 2048 2330 ] 2049 2331 2050 2332 [[package]] 2333 + name = "dioxus-lib" 2334 + version = "0.6.2" 2335 + source = "registry+https://github.com/rust-lang/crates.io-index" 2336 + checksum = "5405b71aa9b8b0c3e0d22728f12f34217ca5277792bd315878cc6ecab7301b72" 2337 + dependencies = [ 2338 + "dioxus-config-macro 0.6.2", 2339 + "dioxus-core 0.6.3", 2340 + "dioxus-core-macro 0.6.3", 2341 + "dioxus-document 0.6.3", 2342 + "dioxus-history 0.6.2", 2343 + "dioxus-hooks 0.6.2", 2344 + "dioxus-html 0.6.3", 2345 + "dioxus-rsx 0.6.2", 2346 + "dioxus-signals 0.6.3", 2347 + "warnings", 2348 + ] 2349 + 2350 + [[package]] 2051 2351 name = "dioxus-liveview" 2052 2352 version = "0.7.1" 2053 2353 source = "registry+https://github.com/rust-lang/crates.io-index" 2054 2354 checksum = "ca4f2850ec1a468c6f15b578c43218562d2309aadaf2b8bf17f54ce30e72f594" 2055 2355 dependencies = [ 2056 2356 "axum", 2057 - "dioxus-cli-config", 2058 - "dioxus-core", 2059 - "dioxus-devtools", 2060 - "dioxus-document", 2061 - "dioxus-history", 2062 - "dioxus-html", 2063 - "dioxus-interpreter-js", 2357 + "dioxus-cli-config 0.7.1", 2358 + "dioxus-core 0.7.1", 2359 + "dioxus-devtools 0.7.1", 2360 + "dioxus-document 0.7.1", 2361 + "dioxus-history 0.7.1", 2362 + "dioxus-html 0.7.1", 2363 + "dioxus-interpreter-js 0.7.1", 2064 2364 "futures-channel", 2065 2365 "futures-util", 2066 - "generational-box", 2366 + "generational-box 0.7.1", 2067 2367 "rustc-hash 2.1.1", 2068 2368 "serde", 2069 2369 "serde_json", ··· 2077 2377 2078 2378 [[package]] 2079 2379 name = "dioxus-logger" 2380 + version = "0.6.2" 2381 + source = "registry+https://github.com/rust-lang/crates.io-index" 2382 + checksum = "545961e752f6c8bf59c274951b3c8b18a106db6ad2f9e2035b29e1f2a3e899b1" 2383 + dependencies = [ 2384 + "console_error_panic_hook", 2385 + "dioxus-cli-config 0.6.3", 2386 + "tracing", 2387 + "tracing-subscriber", 2388 + "tracing-wasm", 2389 + ] 2390 + 2391 + [[package]] 2392 + name = "dioxus-logger" 2080 2393 version = "0.7.1" 2081 2394 source = "registry+https://github.com/rust-lang/crates.io-index" 2082 2395 checksum = "42237934c6a67f5ed9a8c37e47ca980ee7cfec9e783a9a1f8c2e36c8b96ae74b" 2083 2396 dependencies = [ 2084 - "dioxus-cli-config", 2397 + "dioxus-cli-config 0.7.1", 2085 2398 "tracing", 2086 2399 "tracing-subscriber", 2087 2400 "tracing-wasm", ··· 2092 2405 version = "0.0.1" 2093 2406 source = "git+https://github.com/DioxusLabs/components#a15f329d1dc2bd76cd4030b27ecd70edb9fd8c6b" 2094 2407 dependencies = [ 2095 - "dioxus", 2408 + "dioxus 0.7.1", 2096 2409 "dioxus-time", 2097 2410 "lazy-js-bundle 0.6.2", 2098 2411 "num-integer", ··· 2106 2419 source = "registry+https://github.com/rust-lang/crates.io-index" 2107 2420 checksum = "fdf1b95b7cafd07a2b39651ab2b146e4aa72acb0295cd52f422b7db5e2ab6eeb" 2108 2421 dependencies = [ 2109 - "dioxus-cli-config", 2110 - "dioxus-core", 2111 - "dioxus-core-macro", 2422 + "dioxus-cli-config 0.7.1", 2423 + "dioxus-core 0.7.1", 2424 + "dioxus-core-macro 0.7.1", 2112 2425 "dioxus-fullstack-core", 2113 - "dioxus-history", 2114 - "dioxus-hooks", 2115 - "dioxus-html", 2426 + "dioxus-history 0.7.1", 2427 + "dioxus-hooks 0.7.1", 2428 + "dioxus-html 0.7.1", 2116 2429 "dioxus-router-macro", 2117 - "dioxus-signals", 2430 + "dioxus-signals 0.7.1", 2118 2431 "percent-encoding", 2119 2432 "rustversion", 2120 2433 "tracing", ··· 2138 2451 2139 2452 [[package]] 2140 2453 name = "dioxus-rsx" 2454 + version = "0.6.2" 2455 + source = "registry+https://github.com/rust-lang/crates.io-index" 2456 + checksum = "3eb588e05800b5a7eb90b2f40fca5bbd7626e823fb5e1ba21e011de649b45aa1" 2457 + dependencies = [ 2458 + "proc-macro2", 2459 + "proc-macro2-diagnostics", 2460 + "quote", 2461 + "syn 2.0.110", 2462 + ] 2463 + 2464 + [[package]] 2465 + name = "dioxus-rsx" 2141 2466 version = "0.7.1" 2142 2467 source = "registry+https://github.com/rust-lang/crates.io-index" 2143 2468 checksum = "f026380dfda8b93ad995c0a90a62a17b8afeb246baff1b781a52c7b1b3ebd791" ··· 2161 2486 "bytes", 2162 2487 "chrono", 2163 2488 "ciborium", 2164 - "dashmap", 2165 - "dioxus-cli-config", 2166 - "dioxus-core", 2167 - "dioxus-core-macro", 2168 - "dioxus-devtools", 2169 - "dioxus-document", 2489 + "dashmap 6.1.0", 2490 + "dioxus-cli-config 0.7.1", 2491 + "dioxus-core 0.7.1", 2492 + "dioxus-core-macro 0.7.1", 2493 + "dioxus-devtools 0.7.1", 2494 + "dioxus-document 0.7.1", 2170 2495 "dioxus-fullstack-core", 2171 - "dioxus-history", 2172 - "dioxus-hooks", 2173 - "dioxus-html", 2174 - "dioxus-interpreter-js", 2175 - "dioxus-logger", 2496 + "dioxus-history 0.7.1", 2497 + "dioxus-hooks 0.7.1", 2498 + "dioxus-html 0.7.1", 2499 + "dioxus-interpreter-js 0.7.1", 2500 + "dioxus-logger 0.7.1", 2176 2501 "dioxus-router", 2177 - "dioxus-signals", 2502 + "dioxus-signals 0.7.1", 2178 2503 "dioxus-ssr", 2179 2504 "enumset", 2180 2505 "futures", 2181 2506 "futures-channel", 2182 2507 "futures-util", 2183 - "generational-box", 2508 + "generational-box 0.7.1", 2184 2509 "http", 2185 2510 "http-body-util", 2186 2511 "hyper", ··· 2192 2517 "rustc-hash 2.1.1", 2193 2518 "serde", 2194 2519 "serde_json", 2195 - "serde_qs", 2520 + "serde_qs 0.15.0", 2196 2521 "subsecond", 2197 2522 "thiserror 2.0.17", 2198 2523 "tokio", ··· 2208 2533 2209 2534 [[package]] 2210 2535 name = "dioxus-signals" 2536 + version = "0.6.3" 2537 + source = "registry+https://github.com/rust-lang/crates.io-index" 2538 + checksum = "10e032dbb3a2c0386ec8b8ee59bc20b5aeb67038147c855801237b45b13d72ac" 2539 + dependencies = [ 2540 + "dioxus-core 0.6.3", 2541 + "futures-channel", 2542 + "futures-util", 2543 + "generational-box 0.6.2", 2544 + "once_cell", 2545 + "parking_lot", 2546 + "rustc-hash 1.1.0", 2547 + "tracing", 2548 + "warnings", 2549 + ] 2550 + 2551 + [[package]] 2552 + name = "dioxus-signals" 2211 2553 version = "0.7.1" 2212 2554 source = "registry+https://github.com/rust-lang/crates.io-index" 2213 2555 checksum = "3895cc17ff5b43ada07743111be586e7a927ed7ec511457020e4235e13e63fe6" 2214 2556 dependencies = [ 2215 - "dioxus-core", 2557 + "dioxus-core 0.7.1", 2216 2558 "futures-channel", 2217 2559 "futures-util", 2218 - "generational-box", 2560 + "generational-box 0.7.1", 2219 2561 "parking_lot", 2220 2562 "rustc-hash 2.1.1", 2221 2563 "tracing", ··· 2229 2571 checksum = "592391fc30a77f94bc5a3385d1569052907e3b3cecb28099671b9d5801dee6c6" 2230 2572 dependencies = [ 2231 2573 "askama_escape", 2232 - "dioxus-core", 2233 - "dioxus-core-types", 2574 + "dioxus-core 0.7.1", 2575 + "dioxus-core-types 0.7.1", 2234 2576 "rustc-hash 2.1.1", 2235 2577 ] 2236 2578 ··· 2240 2582 source = "registry+https://github.com/rust-lang/crates.io-index" 2241 2583 checksum = "8521729ac35f362476ac4eb7d1c4ab79e7e92a0facfdea3ee978c0ddf7108d37" 2242 2584 dependencies = [ 2243 - "dioxus-core", 2244 - "dioxus-signals", 2585 + "dioxus-core 0.7.1", 2586 + "dioxus-signals 0.7.1", 2245 2587 "dioxus-stores-macro", 2246 2588 ] 2247 2589 ··· 2262 2604 version = "0.7.0" 2263 2605 source = "git+https://github.com/ealmloff/dioxus-std?branch=0.7#8c868ac1d60e3232e3f16f6195d6deb3c016de17" 2264 2606 dependencies = [ 2265 - "dioxus", 2607 + "dioxus 0.7.1", 2266 2608 "futures", 2267 2609 "gloo-timers", 2268 2610 "tokio", ··· 2283 2625 2284 2626 [[package]] 2285 2627 name = "dioxus-web" 2628 + version = "0.6.3" 2629 + source = "registry+https://github.com/rust-lang/crates.io-index" 2630 + checksum = "7e7c12475c3d360058b8afe1b68eb6dfc9cbb7dcd760aed37c5f85c561c83ed1" 2631 + dependencies = [ 2632 + "async-trait", 2633 + "ciborium", 2634 + "dioxus-cli-config 0.6.3", 2635 + "dioxus-core 0.6.3", 2636 + "dioxus-core-types 0.6.2", 2637 + "dioxus-devtools 0.6.2", 2638 + "dioxus-document 0.6.3", 2639 + "dioxus-history 0.6.2", 2640 + "dioxus-html 0.6.3", 2641 + "dioxus-interpreter-js 0.6.2", 2642 + "dioxus-signals 0.6.3", 2643 + "futures-channel", 2644 + "futures-util", 2645 + "generational-box 0.6.2", 2646 + "js-sys", 2647 + "lazy-js-bundle 0.6.2", 2648 + "rustc-hash 1.1.0", 2649 + "serde", 2650 + "serde-wasm-bindgen 0.5.0", 2651 + "serde_json", 2652 + "tracing", 2653 + "wasm-bindgen", 2654 + "wasm-bindgen-futures", 2655 + "web-sys", 2656 + ] 2657 + 2658 + [[package]] 2659 + name = "dioxus-web" 2286 2660 version = "0.7.1" 2287 2661 source = "registry+https://github.com/rust-lang/crates.io-index" 2288 2662 checksum = "76155ecd44535e7c096ec8c5aac4a945899e47567ead4869babdaa74f3f9bca0" 2289 2663 dependencies = [ 2290 - "dioxus-cli-config", 2291 - "dioxus-core", 2292 - "dioxus-core-types", 2293 - "dioxus-devtools", 2294 - "dioxus-document", 2664 + "dioxus-cli-config 0.7.1", 2665 + "dioxus-core 0.7.1", 2666 + "dioxus-core-types 0.7.1", 2667 + "dioxus-devtools 0.7.1", 2668 + "dioxus-document 0.7.1", 2295 2669 "dioxus-fullstack-core", 2296 - "dioxus-history", 2297 - "dioxus-html", 2298 - "dioxus-interpreter-js", 2299 - "dioxus-signals", 2670 + "dioxus-history 0.7.1", 2671 + "dioxus-html 0.7.1", 2672 + "dioxus-interpreter-js 0.7.1", 2673 + "dioxus-signals 0.7.1", 2300 2674 "futures-channel", 2301 2675 "futures-util", 2302 - "generational-box", 2676 + "generational-box 0.7.1", 2303 2677 "gloo-timers", 2304 2678 "js-sys", 2305 2679 "lazy-js-bundle 0.7.1", ··· 2313 2687 "wasm-bindgen-futures", 2314 2688 "wasm-streams", 2315 2689 "web-sys", 2690 + ] 2691 + 2692 + [[package]] 2693 + name = "dioxus_server_macro" 2694 + version = "0.6.2" 2695 + source = "registry+https://github.com/rust-lang/crates.io-index" 2696 + checksum = "371a5b21989a06b53c5092e977b3f75d0e60a65a4c15a2aa1d07014c3b2dda97" 2697 + dependencies = [ 2698 + "proc-macro2", 2699 + "quote", 2700 + "server_fn_macro", 2701 + "syn 2.0.110", 2316 2702 ] 2317 2703 2318 2704 [[package]] ··· 3061 3447 3062 3448 [[package]] 3063 3449 name = "generational-box" 3450 + version = "0.6.2" 3451 + source = "registry+https://github.com/rust-lang/crates.io-index" 3452 + checksum = "a673cf4fb0ea6a91aa86c08695756dfe875277a912cdbf33db9a9f62d47ed82b" 3453 + dependencies = [ 3454 + "parking_lot", 3455 + "tracing", 3456 + ] 3457 + 3458 + [[package]] 3459 + name = "generational-box" 3064 3460 version = "0.7.1" 3065 3461 source = "registry+https://github.com/rust-lang/crates.io-index" 3066 3462 checksum = "b3c1ae09dfd2d455484a54b56129b9821241c4b0e412227806b6c3730cd18a29" ··· 4219 4615 version = "0.9.2" 4220 4616 dependencies = [ 4221 4617 "cid", 4222 - "dashmap", 4618 + "dashmap 6.1.0", 4223 4619 "heck 0.5.0", 4224 4620 "inventory", 4225 4621 "jacquard-common", ··· 4246 4642 "base64 0.22.1", 4247 4643 "bytes", 4248 4644 "chrono", 4249 - "dashmap", 4645 + "dashmap 6.1.0", 4250 4646 "elliptic-curve", 4251 4647 "http", 4252 4648 "jacquard-common", ··· 4698 5094 4699 5095 [[package]] 4700 5096 name = "manganis" 5097 + version = "0.6.2" 5098 + source = "registry+https://github.com/rust-lang/crates.io-index" 5099 + checksum = "317af44b15e7605b85f04525449a3bb631753040156c9b318e6cba8a3ea4ef73" 5100 + dependencies = [ 5101 + "const-serialize 0.6.2", 5102 + "manganis-core 0.6.2", 5103 + "manganis-macro 0.6.2", 5104 + ] 5105 + 5106 + [[package]] 5107 + name = "manganis" 4701 5108 version = "0.7.1" 4702 5109 source = "registry+https://github.com/rust-lang/crates.io-index" 4703 5110 checksum = "124f8f094eb75783b38209ce4d534b9617da4efac652802d9bafe05043a3ec95" 4704 5111 dependencies = [ 4705 - "const-serialize", 4706 - "manganis-core", 4707 - "manganis-macro", 5112 + "const-serialize 0.7.1", 5113 + "manganis-core 0.7.1", 5114 + "manganis-macro 0.7.1", 5115 + ] 5116 + 5117 + [[package]] 5118 + name = "manganis-core" 5119 + version = "0.6.2" 5120 + source = "registry+https://github.com/rust-lang/crates.io-index" 5121 + checksum = "c38bee65cc725b2bba23b5dbb290f57c8be8fadbe2043fb7e2ce73022ea06519" 5122 + dependencies = [ 5123 + "const-serialize 0.6.2", 5124 + "dioxus-cli-config 0.6.3", 5125 + "dioxus-core-types 0.6.2", 5126 + "serde", 4708 5127 ] 4709 5128 4710 5129 [[package]] ··· 4713 5132 source = "registry+https://github.com/rust-lang/crates.io-index" 4714 5133 checksum = "41fbd1fb8c5aabcc54c6b02dbc968e1c89c28f3e543f2789ef9e3ce45dbdf5df" 4715 5134 dependencies = [ 4716 - "const-serialize", 4717 - "dioxus-cli-config", 4718 - "dioxus-core-types", 5135 + "const-serialize 0.7.1", 5136 + "dioxus-cli-config 0.7.1", 5137 + "dioxus-core-types 0.7.1", 4719 5138 "serde", 4720 5139 ] 4721 5140 4722 5141 [[package]] 4723 5142 name = "manganis-macro" 5143 + version = "0.6.2" 5144 + source = "registry+https://github.com/rust-lang/crates.io-index" 5145 + checksum = "d9f4f71310913c40174d9f0cfcbcb127dad0329ecdb3945678a120db22d3d065" 5146 + dependencies = [ 5147 + "dunce", 5148 + "manganis-core 0.6.2", 5149 + "proc-macro2", 5150 + "quote", 5151 + "syn 2.0.110", 5152 + ] 5153 + 5154 + [[package]] 5155 + name = "manganis-macro" 4724 5156 version = "0.7.1" 4725 5157 source = "registry+https://github.com/rust-lang/crates.io-index" 4726 5158 checksum = "45d6fec2a8249739bb30b53a08ecbb217f76096c08f1053f38ec3981ba424c11" 4727 5159 dependencies = [ 4728 5160 "dunce", 4729 5161 "macro-string", 4730 - "manganis-core", 5162 + "manganis-core 0.7.1", 4731 5163 "proc-macro2", 4732 5164 "quote", 4733 5165 "syn 2.0.110", ··· 4983 5415 dependencies = [ 4984 5416 "crossbeam-channel", 4985 5417 "crossbeam-utils", 4986 - "dashmap", 5418 + "dashmap 6.1.0", 4987 5419 "smallvec", 4988 5420 "tagptr", 4989 5421 "triomphe", ··· 4997 5429 dependencies = [ 4998 5430 "crossbeam-channel", 4999 5431 "crossbeam-utils", 5000 - "dashmap", 5432 + "dashmap 6.1.0", 5001 5433 "smallvec", 5002 5434 "tagptr", 5003 5435 "triomphe", ··· 6841 7273 6842 7274 [[package]] 6843 7275 name = "serde-wasm-bindgen" 7276 + version = "0.5.0" 7277 + source = "registry+https://github.com/rust-lang/crates.io-index" 7278 + checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e" 7279 + dependencies = [ 7280 + "js-sys", 7281 + "serde", 7282 + "wasm-bindgen", 7283 + ] 7284 + 7285 + [[package]] 7286 + name = "serde-wasm-bindgen" 6844 7287 version = "0.6.5" 6845 7288 source = "registry+https://github.com/rust-lang/crates.io-index" 6846 7289 checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" ··· 6928 7371 "itoa", 6929 7372 "serde", 6930 7373 "serde_core", 7374 + ] 7375 + 7376 + [[package]] 7377 + name = "serde_qs" 7378 + version = "0.12.0" 7379 + source = "registry+https://github.com/rust-lang/crates.io-index" 7380 + checksum = "0431a35568651e363364210c91983c1da5eb29404d9f0928b67d4ebcfa7d330c" 7381 + dependencies = [ 7382 + "percent-encoding", 7383 + "serde", 7384 + "thiserror 1.0.69", 6931 7385 ] 6932 7386 6933 7387 [[package]] ··· 7021 7475 dependencies = [ 7022 7476 "base16ct", 7023 7477 "serde", 7478 + ] 7479 + 7480 + [[package]] 7481 + name = "server_fn" 7482 + version = "0.6.15" 7483 + source = "registry+https://github.com/rust-lang/crates.io-index" 7484 + checksum = "4fae7a3038a32e5a34ba32c6c45eb4852f8affaf8b794ebfcd4b1099e2d62ebe" 7485 + dependencies = [ 7486 + "bytes", 7487 + "const_format", 7488 + "dashmap 5.5.3", 7489 + "futures", 7490 + "gloo-net", 7491 + "http", 7492 + "js-sys", 7493 + "once_cell", 7494 + "send_wrapper", 7495 + "serde", 7496 + "serde_json", 7497 + "serde_qs 0.12.0", 7498 + "server_fn_macro_default", 7499 + "thiserror 1.0.69", 7500 + "url", 7501 + "wasm-bindgen", 7502 + "wasm-bindgen-futures", 7503 + "wasm-streams", 7504 + "web-sys", 7505 + "xxhash-rust", 7506 + ] 7507 + 7508 + [[package]] 7509 + name = "server_fn_macro" 7510 + version = "0.6.15" 7511 + source = "registry+https://github.com/rust-lang/crates.io-index" 7512 + checksum = "faaaf648c6967aef78177c0610478abb5a3455811f401f3c62d10ae9bd3901a1" 7513 + dependencies = [ 7514 + "const_format", 7515 + "convert_case 0.6.0", 7516 + "proc-macro2", 7517 + "quote", 7518 + "syn 2.0.110", 7519 + "xxhash-rust", 7520 + ] 7521 + 7522 + [[package]] 7523 + name = "server_fn_macro_default" 7524 + version = "0.6.15" 7525 + source = "registry+https://github.com/rust-lang/crates.io-index" 7526 + checksum = "7f2aa8119b558a17992e0ac1fd07f080099564f24532858811ce04f742542440" 7527 + dependencies = [ 7528 + "server_fn_macro", 7529 + "syn 2.0.110", 7024 7530 ] 7025 7531 7026 7532 [[package]] ··· 8398 8904 8399 8905 [[package]] 8400 8906 name = "tungstenite" 8907 + version = "0.23.0" 8908 + source = "registry+https://github.com/rust-lang/crates.io-index" 8909 + checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" 8910 + dependencies = [ 8911 + "byteorder", 8912 + "bytes", 8913 + "data-encoding", 8914 + "http", 8915 + "httparse", 8916 + "log", 8917 + "rand 0.8.5", 8918 + "sha1", 8919 + "thiserror 1.0.69", 8920 + "utf-8", 8921 + ] 8922 + 8923 + [[package]] 8924 + name = "tungstenite" 8401 8925 version = "0.24.0" 8402 8926 source = "registry+https://github.com/rust-lang/crates.io-index" 8403 8927 checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" ··· 8896 9420 "base64 0.22.1", 8897 9421 "chrono", 8898 9422 "console_error_panic_hook", 8899 - "dashmap", 8900 - "dioxus", 9423 + "dashmap 6.1.0", 9424 + "dioxus 0.7.1", 9425 + "dioxus-free-icons", 8901 9426 "dioxus-primitives", 8902 9427 "dotenvy", 8903 9428 "gloo-storage", ··· 8990 9515 "axum", 8991 9516 "chrono", 8992 9517 "clap", 8993 - "dashmap", 9518 + "dashmap 6.1.0", 8994 9519 "diesel", 8995 9520 "diesel-async", 8996 9521 "diesel_migrations", ··· 9035 9560 version = "0.1.0" 9036 9561 dependencies = [ 9037 9562 "bitflags 2.10.0", 9038 - "dashmap", 9563 + "dashmap 6.1.0", 9039 9564 "http", 9040 9565 "ignore", 9041 9566 "insta",
-3
Cargo.toml
··· 58 58 59 59 [profile.wasm-dev] 60 60 inherits = "dev" 61 - opt-level = 1 62 - lto = true 63 61 debug = true 64 62 65 63 [profile.server-dev] 66 64 inherits = "dev" 67 - lto = true 68 65 debug = true 69 66 70 67 [profile.android-dev]
+2 -1
crates/weaver-app/Cargo.toml
··· 5 5 edition = "2024" 6 6 7 7 [features] 8 - default = ["web", "no-app-index"] 8 + default = ["web", "fullstack-server", "no-app-index"] 9 9 # Fullstack mode with SSR and server functions 10 10 fullstack-server = ["dioxus/fullstack"] 11 11 wasm-split = ["dioxus/wasm-split"] ··· 41 41 base64 = "0.22" 42 42 http = "1.3" 43 43 reqwest = { version = "0.12", default-features = false, features = ["json"] } 44 + dioxus-free-icons = { version = "0.9", features = ["font-awesome-brands"] } 44 45 45 46 # diesel = { version = "2.3", features = ["sqlite", "returning_clauses_for_sqlite_3_35", "chrono", "serde_json"] } 46 47 # diesel_migrations = { version = "2.3", features = ["sqlite"] }
+3
crates/weaver-app/Dioxus.toml
··· 5 5 # HTML title tag content 6 6 title = "Weaver" 7 7 8 + out_dir = "dist" 9 + asset_dir = "public" 10 + 8 11 # include `assets` in web platform 9 12 [web.resource] 10 13
+1
crates/weaver-app/assets/styling/navbar.css
··· 36 36 37 37 .auth-button { 38 38 align-self: flex-end; 39 + background-color: var(--color-base); 39 40 } 40 41 41 42 .auth-handle {
+1 -1
crates/weaver-app/assets/styling/profile.css
··· 8 8 9 9 .profile-banner { 10 10 max-width: 100%; 11 - height: 200px; 11 + height: 150px; 12 12 overflow: hidden; 13 13 } 14 14
crates/weaver-app/assets/sw.js crates/weaver-app/public/sw.js
+8 -5
crates/weaver-app/src/auth/mod.rs
··· 6 6 pub use state::AuthState; 7 7 8 8 use crate::fetch::Fetcher; 9 - #[cfg(all(feature = "fullstack-server", feature = "server"))] 10 9 use dioxus::prelude::*; 11 10 #[cfg(all(feature = "fullstack-server", feature = "server"))] 12 11 use jacquard::oauth::types::OAuthClientMetadata; ··· 26 25 } 27 26 28 27 #[cfg(not(target_arch = "wasm32"))] 29 - pub async fn restore_session(_fetcher: Fetcher) -> Result<(), String> { 28 + pub async fn restore_session( 29 + _fetcher: Fetcher, 30 + _auth_state: Signal<AuthState>, 31 + ) -> Result<(), String> { 30 32 Ok(()) 31 33 } 32 34 33 35 #[cfg(target_arch = "wasm32")] 34 - pub async fn restore_session(fetcher: Fetcher) -> Result<(), CapturedError> { 36 + pub async fn restore_session( 37 + fetcher: Fetcher, 38 + mut auth_state: Signal<AuthState>, 39 + ) -> Result<(), CapturedError> { 35 40 use dioxus::prelude::*; 36 41 use gloo_storage::{LocalStorage, Storage}; 37 42 use jacquard::types::string::Did; ··· 70 75 let (restored_did, session_id) = session.session_info().await; 71 76 72 77 // Update auth state 73 - let mut auth_state = try_consume_context::<Signal<AuthState>>() 74 - .ok_or(CapturedError::from_display("AuthState not in context"))?; 75 78 auth_state 76 79 .write() 77 80 .set_authenticated(restored_did, session_id);
+1 -1
crates/weaver-app/src/components/accordion/component.rs
··· 6 6 #[component] 7 7 pub fn Accordion(props: AccordionProps) -> Element { 8 8 rsx! { 9 - document::Link { rel: "stylesheet", href: asset!("./style.css") } 9 + document::Link { rel: "stylesheet", href: asset!("./accordion.css") } 10 10 accordion::Accordion { 11 11 class: "accordion", 12 12 id: props.id,
crates/weaver-app/src/components/accordion/style.css crates/weaver-app/src/components/accordion/accordion.css
+1 -1
crates/weaver-app/src/components/avatar/component.rs
··· 50 50 #[component] 51 51 pub fn Avatar(props: AvatarProps) -> Element { 52 52 rsx! { 53 - document::Link { rel: "stylesheet", href: asset!("./style.css") } 53 + document::Link { rel: "stylesheet", href: asset!("./avatar.css") } 54 54 55 55 avatar::Avatar { 56 56 class: "avatar {props.size.to_class()}",
crates/weaver-app/src/components/avatar/style.css crates/weaver-app/src/components/avatar/avatar.css
+1 -1
crates/weaver-app/src/components/button/component.rs
··· 35 35 children: Element, 36 36 ) -> Element { 37 37 rsx! { 38 - document::Link { rel: "stylesheet", href: asset!("./style.css") } 38 + document::Link { rel: "stylesheet", href: asset!("/assets/styling/button.css") } 39 39 40 40 button { 41 41 class: "button",
crates/weaver-app/src/components/button/style.css crates/weaver-app/assets/styling/button.css
+1 -1
crates/weaver-app/src/components/dialog/component.rs
··· 6 6 #[component] 7 7 pub fn DialogRoot(props: DialogRootProps) -> Element { 8 8 rsx! { 9 - document::Link { rel: "stylesheet", href: asset!("./style.css") } 9 + document::Link { rel: "stylesheet", href: asset!("./dialog.css") } 10 10 dialog::DialogRoot { 11 11 class: "dialog-backdrop", 12 12 id: props.id,
crates/weaver-app/src/components/dialog/style.css crates/weaver-app/src/components/dialog/dialog.css
+76 -73
crates/weaver-app/src/components/entry.rs
··· 4 4 use crate::blobcache::BlobCache; 5 5 use crate::{ 6 6 components::avatar::{Avatar, AvatarImage}, 7 - data::{NotebookHandle, use_handle}, 7 + data::use_handle, 8 8 }; 9 9 10 10 use crate::Route; ··· 30 30 book_title: ReadSignal<SmolStr>, 31 31 title: ReadSignal<SmolStr>, 32 32 ) -> Element { 33 + tracing::debug!( 34 + "EntryPage component rendering for ident: {:?}, book: {}, title: {}", 35 + ident(), 36 + book_title(), 37 + title() 38 + ); 33 39 rsx! { 34 40 {std::iter::once(rsx! {Entry {ident, book_title, title}})} 35 41 } ··· 41 47 book_title: ReadSignal<SmolStr>, 42 48 title: ReadSignal<SmolStr>, 43 49 ) -> Element { 50 + tracing::debug!( 51 + "Entry component rendering for ident: {:?}, book: {}, title: {}", 52 + ident(), 53 + book_title(), 54 + title() 55 + ); 44 56 // Use feature-gated hook for SSR support 45 57 let entry = crate::data::use_entry_data(ident, book_title, title); 46 - let handle = use_context::<NotebookHandle>(); 47 58 let fetcher = use_context::<crate::fetch::Fetcher>(); 59 + tracing::debug!("Entry component got entry data"); 48 60 49 61 // Handle blob caching when entry data is available 50 - if let Ok(entry) = entry { 51 - match &*entry.read() { 52 - Some((book_entry_view, entry_record)) => { 53 - if let Some(embeds) = &entry_record.embeds { 54 - if let Some(images) = &embeds.images { 55 - // Register blob mappings with service worker (client-side only) 56 - #[cfg(all( 57 - target_family = "wasm", 58 - target_os = "unknown", 59 - not(feature = "fullstack-server") 60 - ))] 61 - { 62 - let fetcher = fetcher.clone(); 63 - let images = images.clone(); 64 - spawn(async move { 65 - let _ = crate::service_worker::register_entry_blobs( 66 - &ident(), 67 - book_title().as_str(), 68 - &images, 69 - &fetcher, 70 - ) 71 - .await; 72 - }); 73 - } 62 + match &*entry.read() { 63 + Some((book_entry_view, entry_record)) => { 64 + if let Some(embeds) = &entry_record.embeds { 65 + if let Some(images) = &embeds.images { 66 + // Register blob mappings with service worker (client-side only) 67 + #[cfg(all( 68 + target_family = "wasm", 69 + target_os = "unknown", 70 + not(feature = "fullstack-server") 71 + ))] 72 + { 73 + let fetcher = fetcher.clone(); 74 + let images = images.clone(); 75 + spawn(async move { 76 + let _ = crate::service_worker::register_entry_blobs( 77 + &ident(), 78 + book_title().as_str(), 79 + &images, 80 + &fetcher, 81 + ) 82 + .await; 83 + }); 74 84 } 75 85 } 76 - rsx! { EntryPageView { 77 - book_entry_view: book_entry_view.clone(), 78 - entry_record: entry_record.clone(), 79 - ident: handle.as_ref().unwrap().clone(), 80 - book_title: book_title() 81 - } } 82 86 } 83 - _ => rsx! { p { "Loading..." } }, 87 + rsx! { EntryPageView { 88 + book_entry_view: book_entry_view.clone(), 89 + entry_record: entry_record.clone(), 90 + ident: ident(), 91 + book_title: book_title() 92 + } } 84 93 } 85 - } else { 86 - rsx! { p { "Loading..." } } 94 + _ => rsx! { p { "Loading..." } }, 87 95 } 88 96 } 89 97 90 98 /// Full entry page with metadata, content, and navigation 91 99 #[component] 92 100 fn EntryPageView( 93 - book_entry_view: BookEntryView<'static>, 94 - entry_record: entry::Entry<'static>, 95 - ident: AtIdentifier<'static>, 96 - book_title: SmolStr, 101 + book_entry_view: ReadSignal<BookEntryView<'static>>, 102 + entry_record: ReadSignal<entry::Entry<'static>>, 103 + ident: ReadSignal<AtIdentifier<'static>>, 104 + book_title: ReadSignal<SmolStr>, 97 105 ) -> Element { 98 106 // Extract metadata 99 - let entry_view = &book_entry_view.entry; 107 + let entry_view = &book_entry_view().entry; 100 108 let title = entry_view 101 109 .title 102 110 .as_ref() ··· 110 118 111 119 div { class: "entry-page-layout", 112 120 // Left gutter with prev button 113 - if let Some(ref prev) = book_entry_view.prev { 121 + if let Some(ref prev) = book_entry_view().prev { 114 122 div { class: "nav-gutter nav-prev", 115 123 NavButton { 116 124 direction: "prev", 117 125 entry: prev.entry.clone(), 118 - ident: ident.clone(), 119 - book_title: book_title.clone() 126 + ident: ident(), 127 + book_title: book_title() 120 128 } 121 129 } 122 130 } ··· 126 134 // Metadata header 127 135 EntryMetadata { 128 136 entry_view: entry_view.clone(), 129 - ident: ident.clone(), 130 - created_at: entry_record.created_at.clone() 137 + created_at: entry_record().created_at.clone() 131 138 } 132 139 133 140 // Rendered markdown 134 - EntryMarkdownDirect { 141 + EntryMarkdown { 135 142 content: entry_record, 136 - ident: ident.clone() 143 + ident 137 144 } 138 145 } 139 146 140 147 // Right gutter with next button 141 - if let Some(ref next) = book_entry_view.next { 148 + if let Some(ref next) = book_entry_view().next { 142 149 div { class: "nav-gutter nav-next", 143 150 NavButton { 144 151 direction: "next", 145 152 entry: next.entry.clone(), 146 - ident: ident.clone(), 147 - book_title: book_title.clone() 153 + ident: ident(), 154 + book_title: book_title() 148 155 } 149 156 } 150 157 } ··· 157 164 entry: BookEntryView<'static>, 158 165 book_title: SmolStr, 159 166 author_count: usize, 167 + ident: AtIdentifier<'static>, 160 168 ) -> Element { 161 169 use crate::Route; 162 170 use jacquard::from_data; ··· 168 176 .as_ref() 169 177 .map(|t| t.as_ref()) 170 178 .unwrap_or("Untitled"); 171 - 172 - let ident = use_context::<NotebookHandle>(); 173 179 // Format date 174 180 let formatted_date = entry_view 175 181 .indexed_at ··· 197 203 div { class: "entry-card", 198 204 Link { 199 205 to: Route::EntryPage { 200 - ident: ident.as_ref().unwrap().clone(), 206 + ident: ident, 201 207 book_title: book_title.clone(), 202 208 title: title.to_string().into() 203 209 }, ··· 221 227 match &author.record.inner { 222 228 ProfileDataViewInner::ProfileView(profile) => { 223 229 let display_name = profile.display_name.as_ref().map(|n| n.as_ref()).unwrap_or("Unknown"); 230 + let handle = profile.handle.clone(); 224 231 rsx! { 225 232 if let Some(ref avatar_url) = profile.avatar { 226 233 Avatar { ··· 228 235 } 229 236 } 230 237 span { class: "author-name", "{display_name}" } 231 - span { class: "meta-label", "@{ident.as_ref().unwrap()}" } 238 + span { class: "meta-label", "@{handle}" } 232 239 } 233 240 } 234 241 ProfileDataViewInner::ProfileViewDetailed(profile) => { 235 242 let display_name = profile.display_name.as_ref().map(|n| n.as_ref()).unwrap_or("Unknown"); 243 + let handle = profile.handle.clone(); 236 244 rsx! { 237 245 if let Some(ref avatar_url) = profile.avatar { 238 246 Avatar { ··· 240 248 } 241 249 } 242 250 span { class: "author-name", "{display_name}" } 243 - span { class: "meta-label", "@{ident.as_ref().unwrap()}" } 251 + span { class: "meta-label", "@{handle}" } 244 252 } 245 253 } 246 254 ProfileDataViewInner::TangledProfileView(profile) => { ··· 282 290 283 291 /// Metadata header showing title, authors, date, tags 284 292 #[component] 285 - fn EntryMetadata( 286 - entry_view: EntryView<'static>, 287 - ident: AtIdentifier<'static>, 288 - created_at: Datetime, 289 - ) -> Element { 293 + fn EntryMetadata(entry_view: EntryView<'static>, created_at: Datetime) -> Element { 290 294 let title = entry_view 291 295 .title 292 296 .as_ref() ··· 311 315 match &author.record.inner { 312 316 ProfileDataViewInner::ProfileView(profile) => { 313 317 let display_name = profile.display_name.as_ref().map(|n| n.as_ref()).unwrap_or("Unknown"); 318 + let handle = profile.handle.clone(); 319 + 314 320 rsx! { 315 321 Link { 316 - to: Route::RepositoryIndex { ident: ident.clone() }, 322 + to: Route::RepositoryIndex { ident: AtIdentifier::Handle(handle.clone()) }, 317 323 div { class: "entry-authors", 318 324 if let Some(ref avatar_url) = profile.avatar { 319 325 Avatar { ··· 323 329 } 324 330 } 325 331 span { class: "author-name", "{display_name}" } 326 - span { class: "meta-label", "@{ident}" } 332 + span { class: "meta-label", "@{handle}" } 327 333 } 328 334 } 329 335 } 330 336 } 331 337 ProfileDataViewInner::ProfileViewDetailed(profile) => { 332 338 let display_name = profile.display_name.as_ref().map(|n| n.as_ref()).unwrap_or("Unknown"); 339 + let handle = profile.handle.clone(); 333 340 rsx! { 334 341 Link { 335 - to: Route::RepositoryIndex { ident: ident.clone() }, 342 + to: Route::RepositoryIndex { ident: AtIdentifier::Handle(handle.clone()) }, 336 343 div { class: "entry-authors", 337 344 if let Some(ref avatar_url) = profile.avatar { 338 345 Avatar { ··· 342 349 } 343 350 } 344 351 span { class: "author-name", "{display_name}" } 345 - span { class: "meta-label", "@{ident}" } 352 + span { class: "meta-label", "@{handle}" } 346 353 } 347 354 } 348 355 } ··· 423 430 pub struct EntryMarkdownProps { 424 431 #[props(default)] 425 432 id: Signal<String>, 426 - #[props(default)] 433 + #[props(default = use_signal(||"entry".to_string()))] 427 434 class: Signal<String>, 428 435 content: ReadSignal<entry::Entry<'static>>, 429 436 ident: ReadSignal<AtIdentifier<'static>>, 430 437 } 431 438 432 439 /// Render some text as markdown. 433 - #[allow(unused)] 434 440 pub fn EntryMarkdown(props: EntryMarkdownProps) -> Element { 435 - let processed = crate::data::use_rendered_markdown( 436 - props.content, 437 - props.ident, 438 - )?; 441 + let processed = crate::data::use_rendered_markdown(props.content, props.ident); 439 442 440 443 match &*processed.read() { 441 - Some(Some(html_buf)) => rsx! { 444 + Some(html_buf) => rsx! { 442 445 div { 443 446 id: "{&*props.id.read()}", 444 447 class: "{&*props.class.read()}", ··· 466 469 // Use feature-gated hook for SSR support 467 470 let content = use_signal(|| content); 468 471 let ident = use_signal(|| ident); 469 - let processed = crate::data::use_rendered_markdown(content.into(), ident.into())?; 472 + let processed = crate::data::use_rendered_markdown(content.into(), ident.into()); 470 473 471 474 match &*processed.read() { 472 - Some(Some(html_buf)) => rsx! { 475 + Some(html_buf) => rsx! { 473 476 div { 474 477 id: "{id}", 475 478 class: "{class}",
+34 -35
crates/weaver-app/src/components/identity.rs
··· 8 8 9 9 #[component] 10 10 pub fn Repository(ident: ReadSignal<AtIdentifier<'static>>) -> Element { 11 - // Fetch notebooks for this specific DID with SSR support 12 - let notebooks = data::use_notebooks_for_did(ident)?; 13 - use_context_provider(|| notebooks); 11 + tracing::debug!("Repository component rendering for ident: {:?}", ident()); 12 + // Fetch notebooks for this specific DID with SSR support; 13 + tracing::debug!("Repository component context set up"); 14 + 14 15 rsx! { 15 16 div { 16 17 Outlet::<Route> {} ··· 18 19 } 19 20 } 20 21 21 - pub fn use_repo_notebook_context() 22 - -> Option<Memo<Option<Vec<(NotebookView<'static>, Vec<StrongRef<'static>>)>>>> { 23 - try_use_context::<Memo<Option<Vec<(NotebookView<'static>, Vec<StrongRef<'static>>)>>>>() 24 - } 25 - 26 22 #[component] 27 23 pub fn RepositoryIndex(ident: ReadSignal<AtIdentifier<'static>>) -> Element { 24 + tracing::debug!( 25 + "RepositoryIndex component rendering for ident: {:?}", 26 + ident() 27 + ); 28 28 use crate::components::ProfileDisplay; 29 - let notebooks = use_repo_notebook_context(); 30 - let profile = crate::data::use_profile_data(ident)?; 29 + let notebooks = data::use_notebooks_for_did(ident); 30 + let profile = crate::data::use_profile_data(ident); 31 + tracing::debug!("RepositoryIndex got profile and notebooks"); 31 32 rsx! { 32 33 document::Stylesheet { href: NOTEBOOK_CARD_CSS } 33 34 34 35 div { class: "repository-layout", 35 36 // Profile sidebar (desktop) / header (mobile) 36 37 aside { class: "repository-sidebar", 37 - ProfileDisplay { profile } 38 + ProfileDisplay { profile, notebooks } 38 39 } 39 40 40 41 // Main content area 41 42 main { class: "repository-main", 42 43 div { class: "notebooks-list", 43 - if let Some(notebooks) = notebooks { 44 - match &*notebooks.read() { 45 - Some(notebook_list) => rsx! { 46 - for notebook in notebook_list.iter() { 47 - { 48 - let view = &notebook.0; 49 - let entries = &notebook.1; 50 - rsx! { 51 - div { 52 - key: "{view.cid}", 53 - NotebookCard { 54 - notebook: view.clone(), 55 - entry_refs: entries.clone() 56 - } 57 - } 58 - } 59 - } 60 - } 61 - }, 62 - None => rsx! { 63 - div { "Loading notebooks..." } 64 - } 65 - } 66 - } 44 + match &*notebooks.read() { 45 + Some(notebook_list) => rsx! { 46 + for notebook in notebook_list.iter() { 47 + { 48 + let view = &notebook.0; 49 + let entries = &notebook.1; 50 + rsx! { 51 + div { 52 + key: "{view.cid}", 53 + NotebookCard { 54 + notebook: view.clone(), 55 + entry_refs: entries.clone() 56 + } 57 + } 58 + } 59 + } 60 + } 61 + }, 62 + None => rsx! { 63 + div { "Loading notebooks..." } 64 + } 65 + } 67 66 } 68 67 } 69 68 }
+1 -1
crates/weaver-app/src/components/input/component.rs
··· 26 26 children: Element, 27 27 ) -> Element { 28 28 rsx! { 29 - document::Link { rel: "stylesheet", href: asset!("./style.css") } 29 + document::Link { rel: "stylesheet", href: asset!("./input-style.css") } 30 30 input { 31 31 class: "input", 32 32 oninput: move |e| _ = oninput.map(|callback| callback(e)),
crates/weaver-app/src/components/input/style.css crates/weaver-app/src/components/input/input-style.css
+1 -4
crates/weaver-app/src/components/notebook_cover.rs
··· 1 1 #![allow(non_snake_case)] 2 2 3 - use crate::{ 4 - components::avatar::{Avatar, AvatarImage}, 5 - data::NotebookHandle, 6 - }; 3 + use crate::components::avatar::{Avatar, AvatarImage}; 7 4 use dioxus::prelude::*; 8 5 use weaver_api::sh_weaver::notebook::NotebookView; 9 6
+5 -4
crates/weaver-app/src/components/profile.rs
··· 5 5 use crate::components::{ 6 6 BskyIcon, TangledIcon, 7 7 avatar::{Avatar, AvatarImage}, 8 - identity::use_repo_notebook_context, 9 8 }; 10 9 use dioxus::prelude::*; 11 10 use weaver_api::com_atproto::repo::strong_ref::StrongRef; ··· 15 14 const PROFILE_CSS: Asset = asset!("/assets/styling/profile.css"); 16 15 17 16 #[component] 18 - pub fn ProfileDisplay(profile: Memo<Option<ProfileDataView<'static>>>) -> Element { 19 - let notebooks = use_repo_notebook_context(); 17 + pub fn ProfileDisplay( 18 + profile: Memo<Option<ProfileDataView<'static>>>, 19 + notebooks: Memo<Option<Vec<(NotebookView<'static>, Vec<StrongRef<'static>>)>>>, 20 + ) -> Element { 20 21 match &*profile.read() { 21 22 Some(profile_view) => { 22 23 let profile_view = Arc::new(profile_view.clone()); ··· 57 58 div { 58 59 class: "profile-extras", 59 60 // Stats 60 - ProfileStats { notebooks: notebooks.unwrap() } 61 + ProfileStats { notebooks: notebooks } 61 62 62 63 // Links 63 64 ProfileLinks { profile_view }
+216 -86
crates/weaver-app/src/data.rs
··· 36 36 ident: ReadSignal<AtIdentifier<'static>>, 37 37 book_title: ReadSignal<SmolStr>, 38 38 title: ReadSignal<SmolStr>, 39 - ) -> Result<Memo<Option<(BookEntryView<'static>, Entry<'static>)>>, RenderError> { 39 + ) -> Memo<Option<(BookEntryView<'static>, Entry<'static>)>> { 40 40 let fetcher = use_context::<crate::fetch::Fetcher>(); 41 41 let fetcher = fetcher.clone(); 42 42 let res = use_server_future(move || { ··· 75 75 None 76 76 } 77 77 } 78 - })?; // Handle the Result first to avoid calling use_memo in a closure 79 - Ok(use_memo(move || { 78 + }); 79 + use_memo(use_reactive!(|res| { 80 + let res = res.ok()?; 80 81 if let Some(Some((ev, e))) = &*res.read() { 81 82 use jacquard::from_json_value; 82 83 ··· 95 96 ident: ReadSignal<AtIdentifier<'static>>, 96 97 book_title: ReadSignal<SmolStr>, 97 98 title: ReadSignal<SmolStr>, 98 - ) -> Result<Memo<Option<(BookEntryView<'static>, Entry<'static>)>>, RenderError> { 99 + ) -> Memo<Option<(BookEntryView<'static>, Entry<'static>)>> { 99 100 let fetcher = use_context::<crate::fetch::Fetcher>(); 100 101 let fetcher = fetcher.clone(); 101 102 let res = use_resource(move || { 102 103 let fetcher = fetcher.clone(); 103 104 async move { 104 - fetcher 105 + if let Some(entry) = fetcher 105 106 .get_entry(ident(), book_title(), title()) 106 107 .await 107 108 .ok() 108 109 .flatten() 109 - .map(|arc| { 110 - ( 111 - serde_json::to_value(arc.0.clone()).unwrap(), 112 - serde_json::to_value(arc.1.clone()).unwrap(), 113 - ) 114 - }) 110 + { 111 + let (_book_entry_view, entry_record) = (&entry.0, &entry.1); 112 + if let Some(embeds) = &entry_record.embeds { 113 + if let Some(images) = &embeds.images { 114 + #[cfg(all( 115 + target_family = "wasm", 116 + target_os = "unknown", 117 + not(feature = "fullstack-server") 118 + ))] 119 + { 120 + let _ = crate::service_worker::register_entry_blobs( 121 + &ident(), 122 + book_title().as_str(), 123 + images, 124 + &fetcher, 125 + ) 126 + .await; 127 + } 128 + } 129 + } 130 + Some(( 131 + serde_json::to_value(entry.0.clone()).unwrap(), 132 + serde_json::to_value(entry.1.clone()).unwrap(), 133 + )) 134 + } else { 135 + None 136 + } 115 137 } 116 138 }); 117 - res.suspend()?; 118 - Ok(use_memo(move || { 139 + use_memo(move || { 119 140 if let Some(Some((ev, e))) = &*res.read() { 120 141 use jacquard::from_json_value; 121 142 ··· 126 147 } else { 127 148 None 128 149 } 129 - })) 150 + }) 130 151 } 131 152 132 153 pub fn use_get_handle(did: Did<'static>) -> AtIdentifier<'static> { 133 154 let ident = use_signal(use_reactive!(|did| AtIdentifier::Did(did.clone()))); 134 - use_handle(ident.into()) 135 - .read() 136 - .as_ref() 137 - .unwrap_or(&Ok(ident.read().clone())) 138 - .as_ref() 139 - .unwrap() 140 - .clone() 155 + use_handle(ident.into()).read().clone() 156 + } 157 + 158 + #[cfg(feature = "fullstack-server")] 159 + pub fn use_load_handle( 160 + ident: Option<AtIdentifier<'static>>, 161 + ) -> ReadSignal<Option<AtIdentifier<'static>>> { 162 + let ident = use_signal(use_reactive!(|ident| ident.clone())); 163 + let fetcher = use_context::<crate::fetch::Fetcher>(); 164 + let fetcher = fetcher.clone(); 165 + let res = use_server_future(move || { 166 + let client = fetcher.get_client(); 167 + async move { 168 + if let Some(ident) = &*ident.read() { 169 + use jacquard::smol_str::ToSmolStr; 170 + 171 + client 172 + .resolve_ident_owned(ident) 173 + .await 174 + .map(|doc| doc.handles().first().map(|h| h.to_smolstr())) 175 + .unwrap_or(Some(ident.to_smolstr())) 176 + } else { 177 + None 178 + } 179 + } 180 + }); 181 + 182 + use_memo(use_reactive!(|res| { 183 + if let Ok(res) = res { 184 + if let Some(value) = &*res.read() { 185 + if let Some(handle) = value { 186 + AtIdentifier::new_owned(handle.clone()).ok() 187 + } else { 188 + ident.read().clone() 189 + } 190 + } else { 191 + ident.read().clone() 192 + } 193 + } else { 194 + ident.read().clone() 195 + } 196 + })) 197 + .into() 141 198 } 142 199 143 - pub fn use_handle( 144 - ident: ReadSignal<AtIdentifier<'static>>, 145 - ) -> Resource<Result<AtIdentifier<'static>, IdentityError>> { 200 + #[cfg(not(feature = "fullstack-server"))] 201 + pub fn use_load_handle( 202 + ident: Option<AtIdentifier<'static>>, 203 + ) -> ReadSignal<Option<AtIdentifier<'static>>> { 204 + let ident = use_signal(use_reactive!(|ident| ident.clone())); 205 + let fetcher = use_context::<crate::fetch::Fetcher>(); 206 + let fetcher = fetcher.clone(); 207 + let res = use_resource(move || { 208 + let client = fetcher.get_client(); 209 + async move { 210 + if let Some(ident) = &*ident.read() { 211 + client 212 + .resolve_ident_owned(ident) 213 + .await 214 + .map(|doc| { 215 + doc.handles() 216 + .first() 217 + .map(|h| AtIdentifier::Handle(h.clone()).into_static()) 218 + }) 219 + .unwrap_or(Some(ident.clone())) 220 + } else { 221 + None 222 + } 223 + } 224 + }); 225 + 226 + if let Ok(ident) = res.suspend() { 227 + ident.into() 228 + } else { 229 + ident.into() 230 + } 231 + } 232 + #[cfg(not(feature = "fullstack-server"))] 233 + pub fn use_handle(ident: ReadSignal<AtIdentifier<'static>>) -> ReadSignal<AtIdentifier<'static>> { 234 + let old_ident = ident.read().clone(); 146 235 let fetcher = use_context::<crate::fetch::Fetcher>(); 147 236 let fetcher = fetcher.clone(); 148 - use_resource(move || { 237 + let res = use_resource(move || { 149 238 let client = fetcher.get_client(); 239 + let old_ident = old_ident.clone(); 150 240 async move { 151 241 client 152 242 .resolve_ident_owned(&*ident.read()) ··· 156 246 .first() 157 247 .map(|h| AtIdentifier::Handle(h.clone()).into_static()) 158 248 }) 159 - .map(|h| h.ok_or(IdentityError::invalid_well_known()))? 249 + .ok() 250 + .flatten() 251 + .unwrap_or(old_ident) 160 252 } 161 - }) 253 + }); 254 + if let Ok(ident) = res.suspend() { 255 + ident.into() 256 + } else { 257 + ident 258 + } 162 259 } 260 + #[cfg(feature = "fullstack-server")] 261 + pub fn use_handle(ident: ReadSignal<AtIdentifier<'static>>) -> ReadSignal<AtIdentifier<'static>> { 262 + let old_ident = ident.read().clone(); 263 + let fetcher = use_context::<crate::fetch::Fetcher>(); 264 + let fetcher = fetcher.clone(); 265 + let res = use_server_future(move || { 266 + let client = fetcher.get_client(); 267 + let old_ident = old_ident.clone(); 268 + async move { 269 + use jacquard::smol_str::ToSmolStr; 163 270 164 - #[derive(Clone, PartialEq, Eq)] 165 - pub struct NotebookHandle(pub Arc<Option<AtIdentifier<'static>>>); 271 + client 272 + .resolve_ident_owned(&*ident.read()) 273 + .await 274 + .map(|doc| { 275 + use jacquard::smol_str::ToSmolStr; 166 276 167 - impl NotebookHandle { 168 - pub fn as_ref(&self) -> Option<&AtIdentifier<'static>> { 169 - self.0.as_ref().as_ref() 170 - } 171 - } 277 + doc.handles().first().map(|h| h.to_smolstr()) 278 + }) 279 + .ok() 280 + .flatten() 281 + .unwrap_or(old_ident.to_smolstr()) 282 + } 283 + }); 172 284 173 - pub fn use_notebook_handle(ident: Signal<Option<AtIdentifier<'static>>>) -> NotebookHandle { 174 - let ident = if let Some(ident) = &*ident.read() { 175 - let _ident = Signal::new(ident.clone()); 176 - if let Some(Ok(handle)) = &*use_handle(_ident.into()).read() { 177 - Some(handle.clone()) 285 + use_memo(use_reactive!(|res| { 286 + if let Ok(res) = res { 287 + if let Some(value) = &*res.read() { 288 + AtIdentifier::new_owned(value).unwrap() 289 + } else { 290 + ident.read().clone() 291 + } 178 292 } else { 179 - Some(ident.clone()) 293 + ident.read().clone() 180 294 } 181 - } else { 182 - ident.read().clone() 183 - }; 184 - use_context_provider(|| NotebookHandle(Arc::new(ident))) 295 + })) 296 + .into() 185 297 } 186 298 187 299 /// Hook to render markdown with SSR support. ··· 189 301 pub fn use_rendered_markdown( 190 302 content: ReadSignal<Entry<'static>>, 191 303 ident: ReadSignal<AtIdentifier<'static>>, 192 - ) -> Result<Resource<Option<String>>, RenderError> { 304 + ) -> Memo<Option<String>> { 193 305 let fetcher = use_context::<crate::fetch::Fetcher>(); 194 - Ok(use_server_future(move || { 306 + let res = use_server_future(move || { 195 307 let client = fetcher.get_client(); 196 308 async move { 197 309 let did = match ident() { ··· 200 312 }; 201 313 Some(render_markdown_impl(content(), did).await) 202 314 } 203 - })?) 315 + }); 316 + use_memo(use_reactive!(|res| { 317 + let res = res.ok()?; 318 + if let Some(Some(value)) = &*res.read() { 319 + Some(value.clone()) 320 + } else { 321 + None 322 + } 323 + })) 204 324 } 205 325 206 326 /// Hook to render markdown client-side only (no SSR). ··· 208 328 pub fn use_rendered_markdown( 209 329 content: ReadSignal<Entry<'static>>, 210 330 ident: ReadSignal<AtIdentifier<'static>>, 211 - ) -> Result<Resource<Option<String>>, RenderError> { 331 + ) -> Memo<Option<String>> { 212 332 let fetcher = use_context::<crate::fetch::Fetcher>(); 213 - Ok(use_resource(move || { 333 + let res = use_resource(move || { 214 334 let client = fetcher.get_client(); 215 335 async move { 216 336 let did = match ident() { ··· 219 339 }; 220 340 Some(render_markdown_impl(content(), did).await) 221 341 } 222 - })) 342 + }); 343 + use_memo(move || { 344 + if let Some(Some(value)) = &*res.read() { 345 + Some(value.clone()) 346 + } else { 347 + None 348 + } 349 + }) 223 350 } 224 351 225 352 /// Internal implementation of markdown rendering. ··· 247 374 #[cfg(feature = "fullstack-server")] 248 375 pub fn use_profile_data( 249 376 ident: ReadSignal<AtIdentifier<'static>>, 250 - ) -> Result<Memo<Option<ProfileDataView<'static>>>, RenderError> { 377 + ) -> Memo<Option<ProfileDataView<'static>>> { 251 378 let fetcher = use_context::<crate::fetch::Fetcher>(); 252 379 let res = use_server_future(move || { 253 380 let fetcher = fetcher.clone(); 254 381 async move { 255 - fetcher 382 + tracing::debug!("use_profile_data server future STARTED for {:?}", ident()); 383 + let result = fetcher 256 384 .fetch_profile(&ident()) 257 385 .await 258 386 .ok() 259 387 .map(|arc| serde_json::to_value(&*arc).ok()) 260 - .flatten() 388 + .flatten(); 389 + tracing::debug!("use_profile_data server future COMPLETED for {:?}", ident()); 390 + result 261 391 } 262 - })?; 263 - Ok(use_memo(move || { 392 + }); 393 + use_memo(use_reactive!(|res| { 394 + let res = res.ok()?; 264 395 if let Some(Some(value)) = &*res.read() { 265 396 jacquard::from_json_value::<ProfileDataView>(value.clone()).ok() 266 397 } else { ··· 273 404 #[cfg(not(feature = "fullstack-server"))] 274 405 pub fn use_profile_data( 275 406 ident: ReadSignal<AtIdentifier<'static>>, 276 - ) -> Result<Memo<Option<ProfileDataView<'static>>>, RenderError> { 407 + ) -> Memo<Option<ProfileDataView<'static>>> { 277 408 let fetcher = use_context::<crate::fetch::Fetcher>(); 278 409 let res = use_resource(move || { 279 410 let fetcher = fetcher.clone(); ··· 286 417 .flatten() 287 418 } 288 419 }); 289 - res.suspend()?; 290 - Ok(use_memo(move || { 420 + use_memo(move || { 291 421 if let Some(Some(value)) = &*res.read() { 292 422 jacquard::from_json_value::<ProfileDataView>(value.clone()).ok() 293 423 } else { 294 424 None 295 425 } 296 - })) 426 + }) 297 427 } 298 428 299 429 /// Fetches notebooks for a specific DID 300 430 #[cfg(feature = "fullstack-server")] 301 431 pub fn use_notebooks_for_did( 302 432 ident: ReadSignal<AtIdentifier<'static>>, 303 - ) -> Result<Memo<Option<Vec<(NotebookView<'static>, Vec<StrongRef<'static>>)>>>, RenderError> { 433 + ) -> Memo<Option<Vec<(NotebookView<'static>, Vec<StrongRef<'static>>)>>> { 304 434 let fetcher = use_context::<crate::fetch::Fetcher>(); 305 435 let res = use_server_future(move || { 306 436 let fetcher = fetcher.clone(); ··· 317 447 }) 318 448 .flatten() 319 449 } 320 - })?; 321 - Ok(use_memo(move || { 450 + }); 451 + use_memo(use_reactive!(|res| { 452 + let res = res.ok()?; 322 453 if let Some(Some(values)) = &*res.read() { 323 454 values 324 455 .iter() ··· 336 467 #[cfg(not(feature = "fullstack-server"))] 337 468 pub fn use_notebooks_for_did( 338 469 ident: ReadSignal<AtIdentifier<'static>>, 339 - ) -> Result<Memo<Option<Vec<(NotebookView<'static>, Vec<StrongRef<'static>>)>>>, RenderError> { 470 + ) -> Memo<Option<Vec<(NotebookView<'static>, Vec<StrongRef<'static>>)>>> { 340 471 let fetcher = use_context::<crate::fetch::Fetcher>(); 341 472 let res = use_resource(move || { 342 473 let fetcher = fetcher.clone(); ··· 354 485 .flatten() 355 486 } 356 487 }); 357 - res.suspend()?; 358 - Ok(use_memo(move || { 488 + use_memo(move || { 359 489 if let Some(Some(values)) = &*res.read() { 360 490 values 361 491 .iter() ··· 366 496 } else { 367 497 None 368 498 } 369 - })) 499 + }) 370 500 } 371 501 372 502 /// Fetches notebooks from UFOS with SSR support in fullstack mode 373 503 #[cfg(feature = "fullstack-server")] 374 504 pub fn use_notebooks_from_ufos() 375 - -> Result<Memo<Option<Vec<(NotebookView<'static>, Vec<StrongRef<'static>>)>>>, RenderError> { 505 + -> Memo<Option<Vec<(NotebookView<'static>, Vec<StrongRef<'static>>)>>> { 376 506 let fetcher = use_context::<crate::fetch::Fetcher>(); 377 507 let res = use_server_future(move || { 378 508 let fetcher = fetcher.clone(); ··· 389 519 }) 390 520 .flatten() 391 521 } 392 - })?; 393 - Ok(use_memo(move || { 522 + }); 523 + use_memo(use_reactive!(|res| { 524 + let res = res.ok()?; 394 525 if let Some(Some(values)) = &*res.read() { 395 526 values 396 527 .iter() ··· 407 538 /// Fetches notebooks from UFOS client-side only (no SSR) 408 539 #[cfg(not(feature = "fullstack-server"))] 409 540 pub fn use_notebooks_from_ufos() 410 - -> Result<Memo<Option<Vec<(NotebookView<'static>, Vec<StrongRef<'static>>)>>>, RenderError> { 541 + -> Memo<Option<Vec<(NotebookView<'static>, Vec<StrongRef<'static>>)>>> { 411 542 let fetcher = use_context::<crate::fetch::Fetcher>(); 412 543 let res = use_resource(move || { 413 544 let fetcher = fetcher.clone(); ··· 425 556 .flatten() 426 557 } 427 558 }); 428 - res.suspend()?; 429 - Ok(use_memo(move || { 559 + use_memo(move || { 430 560 if let Some(Some(values)) = &*res.read() { 431 561 values 432 562 .iter() ··· 437 567 } else { 438 568 None 439 569 } 440 - })) 570 + }) 441 571 } 442 572 443 573 /// Fetches notebook metadata with SSR support in fullstack mode ··· 445 575 pub fn use_notebook( 446 576 ident: ReadSignal<AtIdentifier<'static>>, 447 577 book_title: ReadSignal<SmolStr>, 448 - ) -> Result<Memo<Option<(NotebookView<'static>, Vec<StrongRef<'static>>)>>, RenderError> { 578 + ) -> Memo<Option<(NotebookView<'static>, Vec<StrongRef<'static>>)>> { 449 579 let fetcher = use_context::<crate::fetch::Fetcher>(); 450 580 let res = use_server_future(move || { 451 581 let fetcher = fetcher.clone(); ··· 458 588 .map(|arc| serde_json::to_value(arc.as_ref()).ok()) 459 589 .flatten() 460 590 } 461 - })?; 462 - Ok(use_memo(move || { 591 + }); 592 + use_memo(use_reactive!(|res| { 593 + let res = res.ok()?; 463 594 if let Some(Some(value)) = &*res.read() { 464 595 jacquard::from_json_value::<(NotebookView, Vec<StrongRef>)>(value.clone()).ok() 465 596 } else { ··· 473 604 pub fn use_notebook( 474 605 ident: ReadSignal<AtIdentifier<'static>>, 475 606 book_title: ReadSignal<SmolStr>, 476 - ) -> Result<Memo<Option<(NotebookView<'static>, Vec<StrongRef<'static>>)>>, RenderError> { 607 + ) -> Memo<Option<(NotebookView<'static>, Vec<StrongRef<'static>>)>> { 477 608 let fetcher = use_context::<crate::fetch::Fetcher>(); 478 609 let res = use_resource(move || { 479 610 let fetcher = fetcher.clone(); ··· 487 618 .flatten() 488 619 } 489 620 }); 490 - res.suspend()?; 491 - Ok(use_memo(move || { 621 + use_memo(use_reactive!(|res| { 622 + let res = res.ok()?; 492 623 if let Some(Some(value)) = &*res.read() { 493 624 jacquard::from_json_value::<(NotebookView, Vec<StrongRef>)>(value.clone()).ok() 494 625 } else { ··· 502 633 pub fn use_notebook_entries( 503 634 ident: ReadSignal<AtIdentifier<'static>>, 504 635 book_title: ReadSignal<SmolStr>, 505 - ) -> Result<Memo<Option<Vec<BookEntryView<'static>>>>, RenderError> { 636 + ) -> Memo<Option<Vec<BookEntryView<'static>>>> { 506 637 let fetcher = use_context::<crate::fetch::Fetcher>(); 507 638 let res = use_server_future(move || { 508 639 let fetcher = fetcher.clone(); ··· 520 651 }) 521 652 .flatten() 522 653 } 523 - })?; 524 - res.suspend()?; 525 - Ok(use_memo(move || { 654 + }); 655 + use_memo(use_reactive!(|res| { 656 + let res = res.ok()?; 526 657 if let Some(Some(values)) = &*res.read() { 527 658 values 528 659 .iter() ··· 539 670 pub fn use_notebook_entries( 540 671 ident: ReadSignal<AtIdentifier<'static>>, 541 672 book_title: ReadSignal<SmolStr>, 542 - ) -> Result<Memo<Option<Vec<BookEntryView<'static>>>>, RenderError> { 673 + ) -> Memo<Option<Vec<BookEntryView<'static>>>> { 543 674 let fetcher = use_context::<crate::fetch::Fetcher>(); 544 675 let r = use_resource(move || { 545 676 let fetcher = fetcher.clone(); ··· 551 682 .flatten() 552 683 } 553 684 }); 554 - r.suspend()?; 555 - Ok(use_memo(move || r.read().as_ref().and_then(|v| v.clone()))) 685 + use_memo(move || r.read().as_ref().and_then(|v| v.clone())) 556 686 } 557 687 558 688 #[cfg(feature = "fullstack-server")]
+3 -3
crates/weaver-app/src/env.rs
··· 1 1 // This file is automatically generated by build.rs 2 2 3 3 #[allow(unused)] 4 - pub const WEAVER_APP_ENV: &'static str = "prod"; 4 + pub const WEAVER_APP_ENV: &'static str = "dev"; 5 5 #[allow(unused)] 6 - pub const WEAVER_APP_HOST: &'static str = "https://alpha.weaver.sh"; 6 + pub const WEAVER_APP_HOST: &'static str = "http://localhost"; 7 7 #[allow(unused)] 8 - pub const WEAVER_APP_DOMAIN: &'static str = "https://alpha.weaver.sh"; 8 + pub const WEAVER_APP_DOMAIN: &'static str = ""; 9 9 #[allow(unused)] 10 10 pub const WEAVER_PORT: &'static str = "8080"; 11 11 #[allow(unused)]
+50 -16
crates/weaver-app/src/main.rs
··· 112 112 use std::sync::Arc; 113 113 114 114 #[cfg(not(feature = "fullstack-server"))] 115 - let router = { 116 - axum::Router::new() 117 - .route("/sw.js", get(serve_sw)) 118 - .merge(dioxus::server::router(App)) 119 - }; 115 + let router = { axum::Router::new().merge(dioxus::server::router(App)) }; 120 116 121 117 #[cfg(feature = "fullstack-server")] 122 118 let router = { ··· 160 156 #[cfg(not(feature = "server"))] 161 157 dioxus::launch(App); 162 158 } 159 + const THEME_DEFAULTS_CSS: Asset = asset!("/assets/styling/theme-defaults.css"); 163 160 164 161 #[component] 165 162 fn App() -> Element { 163 + tracing::debug!("App component rendering"); 164 + #[allow(unused)] 166 165 let fetcher = use_context_provider(|| { 167 166 fetch::Fetcher::new(OAuthClient::new( 168 167 AuthStore::new(), 169 168 ClientData::new_public(CONFIG.oauth.clone()), 170 169 )) 171 170 }); 172 - use_context_provider(|| Signal::new(AuthState::default())); 173 - use_effect(move || { 171 + let auth_state = use_signal(|| AuthState::default()); 172 + #[allow(unused)] 173 + let auth_state = use_context_provider(|| auth_state); 174 + #[cfg(all( 175 + target_family = "wasm", 176 + target_os = "unknown", 177 + feature = "fullstack-server" 178 + ))] 179 + { 174 180 let fetcher = fetcher.clone(); 175 - spawn(async move { 176 - if let Err(e) = auth::restore_session(fetcher).await { 177 - tracing::debug!("Session restoration failed: {}", e); 181 + use_future(move || { 182 + let fetcher = fetcher.clone(); 183 + async move { 184 + if let Err(e) = auth::restore_session(fetcher, auth_state).await { 185 + tracing::debug!("Session restoration failed: {}", e); 186 + } 178 187 } 179 188 }); 180 - }); 189 + } 181 190 182 191 #[cfg(all( 183 192 target_family = "wasm", 184 193 target_os = "unknown", 185 194 not(feature = "fullstack-server") 186 195 ))] 187 - spawn(async move { 188 - let _ = service_worker::register_service_worker().await; 189 - }); 196 + { 197 + let fetcher = fetcher.clone(); 198 + use_future(move || { 199 + let fetcher = fetcher.clone(); 200 + async move { 201 + if let Err(e) = auth::restore_session(fetcher, auth_state).await { 202 + tracing::debug!("Session restoration failed: {}", e); 203 + } 204 + } 205 + }); 206 + } 207 + 208 + #[cfg(all( 209 + target_family = "wasm", 210 + target_os = "unknown", 211 + not(feature = "fullstack-server") 212 + ))] 213 + { 214 + use_effect(move || { 215 + let fetcher = fetcher.clone(); 216 + spawn(async move { 217 + tracing::info!("Registering service worker"); 218 + let _ = service_worker::register_service_worker().await; 219 + }); 220 + }); 221 + } 190 222 191 223 rsx! { 192 224 document::Link { rel: "icon", href: FAVICON } ··· 194 226 document::Link { rel: "stylesheet", href: "https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;1,200;1,300;1,400;1,500;1,600;1,700&family=IBM+Plex+Sans:ital,wght@0,100..700;1,100..700&family=IBM+Plex+Serif:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;1,200;1,300;1,400;1,500;1,600;1,700&display=swap" } 195 227 document::Link { rel: "preconnect", href: "https://fonts.googleapis.com" } 196 228 document::Link { rel: "preconnect", href: "https://fonts.gstatic.com" } 229 + 230 + document::Link { rel: "stylesheet", href: THEME_DEFAULTS_CSS } 197 231 Router::<Route> {} 198 232 } 199 233 } ··· 203 237 fn ErrorLayout() -> Element { 204 238 rsx! { 205 239 ErrorBoundary { 206 - handle_error: move |err: ErrorContext| { 240 + handle_error: move |_err: ErrorContext| { 207 241 #[cfg(feature = "fullstack-server")] 208 242 { 209 - let http_error = FullstackContext::commit_error_status(err.error().unwrap()); 243 + let http_error = FullstackContext::commit_error_status(_err.error().unwrap()); 210 244 match http_error.status { 211 245 StatusCode::NOT_FOUND => rsx! { div { "404 - Page not found" } }, 212 246 _ => rsx! { div { "An unknown error occurred" } },
+17 -6
crates/weaver-app/src/service_worker.rs
··· 12 12 let window = web_sys::window().ok_or_else(|| JsValue::from_str("no window"))?; 13 13 let navigator = window.navigator(); 14 14 let sw_container = navigator.service_worker(); 15 - 15 + tracing::debug!("Registering service worker"); 16 16 let promise = sw_container.register("/sw.js"); 17 17 JsFuture::from(promise).await?; 18 + tracing::debug!("Service worker registered"); 18 19 19 20 Ok(()) 20 21 } ··· 30 31 use jacquard::prelude::IdentityResolver; 31 32 use std::collections::HashMap; 32 33 34 + tracing::debug!("registering blobs for {}", book_title); 33 35 let mut blob_mappings = HashMap::new(); 34 36 35 37 // Resolve DID and PDS URL ··· 61 63 blob_mappings.insert(name.as_ref().to_string(), blob_url); 62 64 } 63 65 } 66 + } 64 67 65 - // Send mappings to service worker 66 - if !blob_mappings.is_empty() { 67 - send_blob_mappings(book_title, blob_mappings)?; 68 - } 68 + // Send mappings to service worker 69 + if !blob_mappings.is_empty() { 70 + send_blob_mappings(book_title, blob_mappings)?; 69 71 } 72 + //} 70 73 71 74 Ok(()) 72 75 } ··· 80 83 let navigator = window.navigator(); 81 84 let sw_container = navigator.service_worker(); 82 85 86 + tracing::debug!("sending blob mappings for {}", notebook); 83 87 let controller = sw_container 84 88 .controller() 85 89 .ok_or_else(|| JsValue::from_str("no service worker controller"))?; ··· 97 101 js_sys::Reflect::set(&msg, &"blobs".into(), &blobs_obj)?; 98 102 99 103 controller.post_message(&msg)?; 104 + tracing::debug!("sent blob mappings for {}", notebook); 100 105 101 106 Ok(()) 102 107 } ··· 117 122 } 118 123 119 124 // #[used] 120 - // static BINDINGS_JS: Asset = asset!("/assets/sw.js", AssetOptions::js().with_hash_suffix(false)); 125 + // static BINDINGS_JS: Asset = asset!( 126 + // "/sw.js", 127 + // AssetOptions::js() 128 + // .with_hash_suffix(false) 129 + // .with_minify(false) 130 + // .with_preload(true) 131 + // );
+3 -4
crates/weaver-app/src/views/home.rs
··· 8 8 #[component] 9 9 pub fn Home() -> Element { 10 10 // Fetch notebooks from UFOS with SSR support 11 - let notebooks = data::use_notebooks_from_ufos()?; 11 + let notebooks = data::use_notebooks_from_ufos(); 12 12 let navigator = use_navigator(); 13 13 let mut uri_input = use_signal(|| String::new()); 14 14 ··· 16 16 let input_uri = uri_input.read().clone(); 17 17 if !input_uri.is_empty() { 18 18 if let Ok(parsed) = AtUri::new(&input_uri) { 19 - navigator.push(Route::RecordPage { 20 - uri: vec![parsed.to_string()], 21 - }); 19 + let link = format!("{}/record/{}", crate::env::WEAVER_APP_DOMAIN, parsed); 20 + navigator.push(link); 22 21 } 23 22 } 24 23 };
+45 -52
crates/weaver-app/src/views/navbar.rs
··· 1 1 use crate::Route; 2 + use crate::auth::AuthState; 2 3 use crate::components::button::{Button, ButtonVariant}; 3 4 use crate::components::login::LoginModal; 4 - use crate::data::{use_get_handle, use_notebook_handle}; 5 + use crate::data::{use_get_handle, use_load_handle}; 5 6 use crate::fetch::Fetcher; 6 7 use dioxus::prelude::*; 7 - use jacquard::types::did::Did; 8 8 9 - const THEME_DEFAULTS_CSS: Asset = asset!("/assets/styling/theme-defaults.css"); 10 9 const NAVBAR_CSS: Asset = asset!("/assets/styling/navbar.css"); 11 10 12 11 /// The Navbar component that will be rendered on all pages of our app since every page is under the layout. ··· 16 15 /// routes will be rendered under the outlet inside this component 17 16 #[component] 18 17 pub fn Navbar() -> Element { 18 + tracing::debug!("Navbar component rendering"); 19 19 let route = use_route::<Route>(); 20 + tracing::debug!("Route: {:?}", route); 20 21 21 - let route_handle = use_signal(|| match &route { 22 + let mut auth_state = use_context::<Signal<crate::auth::AuthState>>(); 23 + let route_handle = use_load_handle(match &route { 22 24 Route::EntryPage { ident, .. } => Some(ident.clone()), 23 25 Route::RepositoryIndex { ident } => Some(ident.clone()), 24 26 Route::NotebookIndex { ident, .. } => Some(ident.clone()), 25 27 _ => None, 26 28 }); 27 - let notebook_handle = use_notebook_handle(route_handle); 29 + let fetcher = use_context::<Fetcher>(); 30 + let mut show_login_modal = use_signal(|| false); 31 + 32 + tracing::debug!("Navbar got route_handle: {:?}", route_handle); 28 33 29 34 rsx! { 30 - document::Link { rel: "stylesheet", href: THEME_DEFAULTS_CSS } 31 35 document::Link { rel: "stylesheet", href: NAVBAR_CSS } 32 - 36 + document::Link { rel: "stylesheet", href: asset!("/assets/styling/button.css") } 33 37 div { 34 38 id: "navbar", 35 39 nav { class: "breadcrumbs", ··· 41 45 42 46 // Show repository breadcrumb if we're on a repository page 43 47 match route { 44 - Route::RepositoryIndex { .. } => { 45 - let handle = notebook_handle.as_ref().unwrap(); 48 + Route::RepositoryIndex { ident } => { 49 + let route_handle = route_handle.read().clone(); 50 + let handle = route_handle.unwrap_or(ident.clone()); 46 51 rsx! { 47 52 span { class: "breadcrumb-separator", " > " } 48 53 span { class: "breadcrumb breadcrumb-current", "@{handle}" } 49 54 } 50 55 }, 51 56 Route::NotebookIndex { ident, book_title } => { 52 - let handle = notebook_handle.as_ref().unwrap(); 57 + let route_handle = route_handle.read().clone(); 58 + let handle = route_handle.unwrap_or(ident.clone()); 53 59 rsx! { 54 60 span { class: "breadcrumb-separator", " > " } 55 61 Link { ··· 62 68 } 63 69 }, 64 70 Route::EntryPage { ident, book_title, .. } => { 65 - let handle = notebook_handle.as_ref().unwrap(); 71 + let route_handle = route_handle.read().clone(); 72 + let handle = route_handle.unwrap_or(ident.clone()); 66 73 rsx! { 67 74 span { class: "breadcrumb-separator", " > " } 68 75 Link { ··· 81 88 _ => rsx! {} 82 89 } 83 90 } 84 - LoginButton {} 85 - 86 - } 87 - 88 - Outlet::<Route> {} 89 - } 90 - } 91 - 92 - #[component] 93 - fn LoginButton() -> Element { 94 - let fetcher = use_context::<Fetcher>(); 95 - let mut show_login_modal = use_signal(|| false); 96 - let mut auth_state = use_context::<Signal<crate::auth::AuthState>>(); 97 - let did_signal = use_signal(|| auth_state.read().did.clone()); 98 - if let Some(did) = &*did_signal.read() { 99 - rsx! { 100 - Button { 101 - variant: ButtonVariant::Ghost, 102 - onclick: move |_| { 103 - let fetcher = fetcher.clone(); 104 - auth_state.write().clear(); 105 - async move { 106 - fetcher.downgrade_to_unauthenticated().await; 91 + if auth_state.read().is_authenticated() { 92 + if let Some(did) = &auth_state.read().did { 93 + Button { 94 + variant: ButtonVariant::Ghost, 95 + onclick: move |_| { 96 + let fetcher = fetcher.clone(); 97 + auth_state.write().clear(); 98 + async move { 99 + fetcher.downgrade_to_unauthenticated().await; 100 + } 101 + }, 102 + span { class: "auth-handle", "@{use_get_handle(did.clone())}" } 103 + } 104 + } 105 + } else { 106 + div { 107 + class: "auth-button", 108 + Button { 109 + variant: ButtonVariant::Ghost, 110 + onclick: move |_| show_login_modal.set(true), 111 + span { class: "auth-handle", "Sign In" } 107 112 } 108 - }, 109 - span { class: "auth-handle", "@{use_get_handle(did.clone())}" } 110 - } 111 - LoginModal { 112 - open: show_login_modal 113 - } 114 - } 115 - } else { 116 - rsx! { 117 - div { 118 - class: "auth-button", 119 - Button { 120 - variant: ButtonVariant::Ghost, 121 - onclick: move |_| show_login_modal.set(true), 122 - span { class: "auth-handle", "Sign In" } 113 + 123 114 } 124 - } 125 - LoginModal { 126 - open: show_login_modal 115 + LoginModal { 116 + open: show_login_modal 117 + } 127 118 } 128 119 } 120 + 121 + Outlet::<Route> {} 129 122 } 130 123 }
+13 -5
crates/weaver-app/src/views/notebook.rs
··· 17 17 /// re-run and the rendered HTML will be updated. 18 18 #[component] 19 19 pub fn Notebook(ident: ReadSignal<AtIdentifier<'static>>, book_title: SmolStr) -> Element { 20 + tracing::debug!( 21 + "Notebook component rendering for ident: {:?}, book: {}", 22 + ident(), 23 + book_title 24 + ); 20 25 rsx! { 21 26 NotebookCss { ident: ident.to_smolstr(), notebook: book_title } 22 27 Outlet::<Route> {} ··· 28 33 ident: ReadSignal<AtIdentifier<'static>>, 29 34 book_title: ReadSignal<SmolStr>, 30 35 ) -> Element { 36 + tracing::debug!( 37 + "NotebookIndex component rendering for ident: {:?}, book: {}", 38 + ident(), 39 + book_title() 40 + ); 31 41 // Fetch full notebook metadata with SSR support 32 42 // IMPORTANT: Call ALL hooks before any ? early returns to maintain hook order 33 43 let notebook_data = data::use_notebook(ident, book_title); 34 44 let entries_resource = data::use_notebook_entries(ident, book_title); 35 - 36 - // Now check for errors 37 - let notebook_data = notebook_data?; 38 - let entries_resource = entries_resource?; 45 + tracing::debug!("NotebookIndex got notebook data and entries"); 39 46 40 47 rsx! { 41 48 document::Link { rel: "stylesheet", href: ENTRY_CARD_CSS } ··· 60 67 EntryCard { 61 68 entry: entry.clone(), 62 69 book_title: book_title(), 63 - author_count 70 + author_count, 71 + ident: ident(), 64 72 } 65 73 } 66 74 }
+121 -120
crates/weaver-common/src/agent.rs
··· 614 614 AgentError::from(ClientError::invalid_request("Invalid weaver profile URI")) 615 615 }, 616 616 )?; 617 - let weaver_future = async { 618 - if let Ok(weaver_record) = self.fetch_record(&weaver_uri).await { 619 - // Convert blobs to CDN URLs 620 - let avatar = weaver_record 621 - .value 622 - .avatar 623 - .as_ref() 624 - .map(|blob| { 625 - let cid = blob.blob().cid(); 626 - jacquard::types::string::Uri::new_owned(format!( 627 - "https://cdn.bsky.app/img/avatar/plain/{}/{}@jpeg", 628 - did, cid 629 - )) 630 - }) 631 - .transpose() 632 - .map_err(|_| { 633 - AgentError::from(ClientError::invalid_request("Invalid avatar URI")) 634 - })?; 635 - let banner = weaver_record 636 - .value 637 - .banner 638 - .as_ref() 639 - .map(|blob| { 640 - let cid = blob.blob().cid(); 641 - jacquard::types::string::Uri::new_owned(format!( 642 - "https://cdn.bsky.app/img/banner/plain/{}/{}@jpeg", 643 - did, cid 644 - )) 645 - }) 646 - .transpose() 647 - .map_err(|_| { 648 - AgentError::from(ClientError::invalid_request("Invalid banner URI")) 649 - })?; 617 + // let weaver_future = async { 618 + // if let Ok(weaver_record) = self.fetch_record(&weaver_uri).await { 619 + // // Convert blobs to CDN URLs 620 + // let avatar = weaver_record 621 + // .value 622 + // .avatar 623 + // .as_ref() 624 + // .map(|blob| { 625 + // let cid = blob.blob().cid(); 626 + // jacquard::types::string::Uri::new_owned(format!( 627 + // "https://cdn.bsky.app/img/avatar/plain/{}/{}@jpeg", 628 + // did, cid 629 + // )) 630 + // }) 631 + // .transpose() 632 + // .map_err(|_| { 633 + // AgentError::from(ClientError::invalid_request("Invalid avatar URI")) 634 + // })?; 635 + // let banner = weaver_record 636 + // .value 637 + // .banner 638 + // .as_ref() 639 + // .map(|blob| { 640 + // let cid = blob.blob().cid(); 641 + // jacquard::types::string::Uri::new_owned(format!( 642 + // "https://cdn.bsky.app/img/banner/plain/{}/{}@jpeg", 643 + // did, cid 644 + // )) 645 + // }) 646 + // .transpose() 647 + // .map_err(|_| { 648 + // AgentError::from(ClientError::invalid_request("Invalid banner URI")) 649 + // })?; 650 650 651 - let profile_view = ProfileView::new() 652 - .did(did.clone()) 653 - .handle(handle.clone()) 654 - .maybe_display_name(weaver_record.value.display_name.clone()) 655 - .maybe_description(weaver_record.value.description.clone()) 656 - .maybe_avatar(avatar) 657 - .maybe_banner(banner) 658 - .maybe_bluesky(weaver_record.value.bluesky) 659 - .maybe_tangled(weaver_record.value.tangled) 660 - .maybe_streamplace(weaver_record.value.streamplace) 661 - .maybe_location(weaver_record.value.location.clone()) 662 - .maybe_links(weaver_record.value.links.clone()) 663 - .maybe_pronouns(weaver_record.value.pronouns.clone()) 664 - .maybe_pinned(weaver_record.value.pinned.clone()) 665 - .indexed_at(jacquard::types::string::Datetime::now()) 666 - .maybe_created_at(weaver_record.value.created_at) 667 - .build(); 651 + // let profile_view = ProfileView::new() 652 + // .did(did.clone()) 653 + // .handle(handle.clone()) 654 + // .maybe_display_name(weaver_record.value.display_name.clone()) 655 + // .maybe_description(weaver_record.value.description.clone()) 656 + // .maybe_avatar(avatar) 657 + // .maybe_banner(banner) 658 + // .maybe_bluesky(weaver_record.value.bluesky) 659 + // .maybe_tangled(weaver_record.value.tangled) 660 + // .maybe_streamplace(weaver_record.value.streamplace) 661 + // .maybe_location(weaver_record.value.location.clone()) 662 + // .maybe_links(weaver_record.value.links.clone()) 663 + // .maybe_pronouns(weaver_record.value.pronouns.clone()) 664 + // .maybe_pinned(weaver_record.value.pinned.clone()) 665 + // .indexed_at(jacquard::types::string::Datetime::now()) 666 + // .maybe_created_at(weaver_record.value.created_at) 667 + // .build(); 668 668 669 - Ok(( 670 - Some(weaver_uri.as_uri().clone().into_static()), 671 - ProfileDataView::new() 672 - .inner(ProfileDataViewInner::ProfileView(Box::new(profile_view))) 673 - .build() 674 - .into_static(), 675 - )) 676 - } else { 677 - Err(WeaverError::Agent( 678 - ClientError::invalid_request("Invalid weaver profile URI").into(), 679 - )) 680 - } 681 - }; 669 + // Ok(( 670 + // Some(weaver_uri.as_uri().clone().into_static()), 671 + // ProfileDataView::new() 672 + // .inner(ProfileDataViewInner::ProfileView(Box::new(profile_view))) 673 + // .build() 674 + // .into_static(), 675 + // )) 676 + // } else { 677 + // Err(WeaverError::Agent( 678 + // ClientError::invalid_request("Invalid weaver profile URI").into(), 679 + // )) 680 + // } 681 + // }; 682 682 let bsky_appview_future = async { 683 683 if let Ok(bsky_resp) = self 684 684 .send(GetProfile::new().actor(did.clone()).build()) ··· 718 718 AgentError::from(ClientError::invalid_request("Invalid bsky profile URI")) 719 719 })?; 720 720 721 - let bsky_future = async { 722 - let bsky_record = self.fetch_record(&bsky_uri).await?; 721 + // let bsky_future = async { 722 + // let bsky_record = self.fetch_record(&bsky_uri).await?; 723 723 724 - let avatar = bsky_record 725 - .value 726 - .avatar 727 - .as_ref() 728 - .map(|blob| { 729 - let cid = blob.blob().cid(); 730 - jacquard::types::string::Uri::new_owned(format!( 731 - "https://cdn.bsky.app/img/avatar/plain/{}/{}@jpeg", 732 - did, cid 733 - )) 734 - }) 735 - .transpose() 736 - .map_err(|_| { 737 - AgentError::from(ClientError::invalid_request("Invalid avatar URI")) 738 - })?; 739 - let banner = bsky_record 740 - .value 741 - .banner 742 - .as_ref() 743 - .map(|blob| { 744 - let cid = blob.blob().cid(); 745 - jacquard::types::string::Uri::new_owned(format!( 746 - "https://cdn.bsky.app/img/banner/plain/{}/{}@jpeg", 747 - did, cid 748 - )) 749 - }) 750 - .transpose() 751 - .map_err(|_| { 752 - AgentError::from(ClientError::invalid_request("Invalid banner URI")) 753 - })?; 724 + // let avatar = bsky_record 725 + // .value 726 + // .avatar 727 + // .as_ref() 728 + // .map(|blob| { 729 + // let cid = blob.blob().cid(); 730 + // jacquard::types::string::Uri::new_owned(format!( 731 + // "https://cdn.bsky.app/img/avatar/plain/{}/{}@jpeg", 732 + // did, cid 733 + // )) 734 + // }) 735 + // .transpose() 736 + // .map_err(|_| { 737 + // AgentError::from(ClientError::invalid_request("Invalid avatar URI")) 738 + // })?; 739 + // let banner = bsky_record 740 + // .value 741 + // .banner 742 + // .as_ref() 743 + // .map(|blob| { 744 + // let cid = blob.blob().cid(); 745 + // jacquard::types::string::Uri::new_owned(format!( 746 + // "https://cdn.bsky.app/img/banner/plain/{}/{}@jpeg", 747 + // did, cid 748 + // )) 749 + // }) 750 + // .transpose() 751 + // .map_err(|_| { 752 + // AgentError::from(ClientError::invalid_request("Invalid banner URI")) 753 + // })?; 754 754 755 - let profile_detailed = ProfileViewDetailed::new() 756 - .did(did.clone()) 757 - .handle(handle.clone()) 758 - .maybe_display_name(bsky_record.value.display_name.clone()) 759 - .maybe_description(bsky_record.value.description.clone()) 760 - .maybe_avatar(avatar) 761 - .maybe_banner(banner) 762 - .indexed_at(jacquard::types::string::Datetime::now()) 763 - .maybe_created_at(bsky_record.value.created_at) 764 - .build(); 755 + // let profile_detailed = ProfileViewDetailed::new() 756 + // .did(did.clone()) 757 + // .handle(handle.clone()) 758 + // .maybe_display_name(bsky_record.value.display_name.clone()) 759 + // .maybe_description(bsky_record.value.description.clone()) 760 + // .maybe_avatar(avatar) 761 + // .maybe_banner(banner) 762 + // .indexed_at(jacquard::types::string::Datetime::now()) 763 + // .maybe_created_at(bsky_record.value.created_at) 764 + // .build(); 765 765 766 - Ok(( 767 - Some(bsky_uri.as_uri().clone().into_static()), 768 - ProfileDataView::new() 769 - .inner(ProfileDataViewInner::ProfileViewDetailed(Box::new( 770 - profile_detailed, 771 - ))) 772 - .build() 773 - .into_static(), 774 - )) 775 - }; 766 + // Ok(( 767 + // Some(bsky_uri.as_uri().clone().into_static()), 768 + // ProfileDataView::new() 769 + // .inner(ProfileDataViewInner::ProfileViewDetailed(Box::new( 770 + // profile_detailed, 771 + // ))) 772 + // .build() 773 + // .into_static(), 774 + // )) 775 + // }; 776 776 777 - n0_future::future::or( 778 - weaver_future, 779 - n0_future::future::or(bsky_appview_future, bsky_future), 780 - ) 781 - .await 777 + // n0_future::future::or( 778 + // weaver_future, 779 + // n0_future::future::or(bsky_appview_future, bsky_future), 780 + // ) 781 + // .await 782 + bsky_appview_future.await 782 783 } 783 784 } 784 785
-1
crates/weaver-renderer/src/atproto/client.rs
··· 203 203 if let Some(embeds) = &entry.embeds { 204 204 if let Some(images) = &embeds.images { 205 205 for img in &images.images { 206 - tracing::info!("Image: {:?}", img); 207 206 if let Some(name) = &img.name { 208 207 let blob_name = BlobName::from_filename(name.as_ref()); 209 208 map.insert(blob_name, img.image.blob().cid().clone().into_static());